Потоковая безопасность (презентация), страница 3
Описание файла
PDF-файл из архива "Потоковая безопасность (презентация)", который расположен в категории "". Всё это находится в предмете "параллельные системы и параллельные вычисления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "параллельные системы и параллельные вычисления" в общих файлах.
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
д.Лекция 842 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыРеализация совместного чтенияПримерvoid Storage::read(Data &rData){shared_lock <shared_mutex> lock(m_Mutex);// . . .}void Storage::write(const Data &rcData){lock_guard <shared_mutex> lock(m_Mutex);// . . .}Лекция 843 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыДругие классы блокировок (Boost)Классы блокировокupgrade_lock(методы lock(), unlock(), owns_lock(), к bool)upgrade_to_unique_lock(методы owns_lock(), к bool)Инициализация/присваиваниеupgrade_lock→ upgrade_to_unique_lockЛекция 844 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыДругие классы блокировок (Boost)Классы блокировокupgrade_lock(методы lock(), unlock(), owns_lock(), к bool)upgrade_to_unique_lock(методы owns_lock(), к bool)Инициализация/присваиваниеupgrade_lock→ upgrade_to_unique_lockЛекция 844 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыРеализация чтения и записиПримерvoid Storage::update_and_write(/∗ .
. . ∗/){upgrade_lock <shared_mutex> lock1(m_Mutex);// . . .{upgrade_to_unique_lock <shared_mutex> lock2(lock1);// . . .}// . . .}Лекция 845 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование библиотеки условных переменныхПример (Boost)#include <boost/thread/condition_variable.hpp>using namespace boost;Пример (C ++0x)#include <condition_variable>using namespace std;Лекция 846 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыМетоды condition_variable[_any]Методы (владение, освобождение)native_handle_type native_handle();void notify_one();void notify_all();Лекция 847 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыМетоды condition_variable (окончание)Ожиданиеvoid wait(unique_lock <mutex> &);template <class Predicate>void wait(unique_lock <mutex> &, Predicate pred);bool timed_wait(unique_lock <mutex> &, system_time const &rcAbsTime);(Boost)template <typename DurationType>bool timed_wait(unique_lock <mutex> &, DurationType const &rcRelTime);timed_wait()(Boost)с предикатом (Boost)wait_for(), wait_until()без/с предикатом (C ++0x)Лекция 848 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыМетоды condition_variable_any (окончание)Ожиданиеtemplate <class Lock>void wait(Lock &);template <class Lock, class Predicate>void wait(Lock &, Predicate pred);template <class Lock>bool timed_wait(Lock &, system_time const &rcAbsTime);(Boost)template <class Lock, typename DurationType>bool timed_wait(Lock &, DurationType const &rcRelTime); (Boost)timed_wait()с предикатом (Boost)wait_for(), wait_until()без/с предикатом (C ++0x)Лекция 849 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование условных переменныхПримерПример (окончание)condition_variable g_Cond;mutex g_Mtx;bool g_bDataReady;void process_data();void retrieve_and_process_data();void prepare_data_for_processing(){retrieve_and_process_data();{lock_guard <mutex> l(g_Mtx);g_bDataReady = true;void wait_for_data_to_process(){unique_lock <mutex> l(g_Mtx);while (!g_bDataReady)g_Cond.wait(l);process_data();}g_Cond.notify_one();}}Лекция 850 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыОпределение boost::barrierBoost// #include <boost/thread/barrier.hpp>class barrier{public:barrier(unsigned int uCount);~barrier();bool wait();};Лекция 851 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковСинхронизация на уровне объектовСинхронизация в стандартной библиотекеАвтоматическая синхронизацияПримерПример (окончание)template <class T, class G>class GuardedT{private:T &m_rT;G &m_rG;public:class GL{private:// охраняемый объект// мьютексGL &operator = (const GL &);friend class GuardedT <T, G>;GL(T &rT, G &rG): m_rT(rT), m_rG(rG){ m_rG.lock(); }public:~GL() { m_rG.unlock(); }T *operator -> (){ return &m_rT; }T &operator * (){ return m_rT; }T &m_rT;G &m_rG;};Лекция 8// GuardedT <T, G>::GL52 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковСинхронизация на уровне объектовСинхронизация в стандартной библиотекеАвтоматическая синхронизация (продолжение)Пример (окончание)GL operator -> () { return GL(m_rT, m_rG); }GL operator * () { return GL(m_rT, m_rG); }// .
. .};// template <class T, class G> class GuardedTЛекция 853 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковСинхронизация на уровне объектовСинхронизация в стандартной библиотекеАвтоматическая синхронизация (продолжение)Пример (использование GuardedT)int main(){typedef GuardedT <vector <int>, mutex> IntVector;IntVector v(new vector <int> (), new mutex());v->push_back(1);// . . .}Лекция 854 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковСинхронизация на уровне объектовСинхронизация в стандартной библиотекеАвтоматическая синхронизация (окончание)Примерvoid Collection::add(const Data &rcData){m_Vector.push_back(rcData);std::sort(m_Vector.begin(), m_Vector.end());}Лекция 855 / 55.