Потоковая безопасность (презентация), страница 2
Описание файла
PDF-файл из архива "Потоковая безопасность (презентация)", который расположен в категории "". Всё это находится в предмете "параллельные системы и параллельные вычисления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
. .}private:Callable(const Callable &);};// . . .thread1.join();// . . .}Лекция 822 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки с некопируемыми параметрамиПримерПример (окончание)struct Callable{Callable() {}void operator () (int &rn)int main(){// . . .int n = 10;boost::thread thread2({// .
. .boost::ref(callable),n);thread2.join();cout << "n == " << n << endl;++ rn;}private:Callable(const Callable &);};Лекция 8// . . .}23 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки с некопируемыми параметрамиПримерПример (окончание)struct Callable{Callable() {}void operator () (int &rn)int main(){// . .
.int n = 10;boost::thread thread2({// . . .boost::ref(callable),boost::ref(n));thread2.join();cout << "n == " << n << endl;++ rn;}private:Callable(const Callable &);};Лекция 8// . . .}23 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПередача локальных буферов в потокиПример (функция потока)Пример (вызов)struct Callable{void operator () (const std::string &rcStr){boost::this_thread::sleep(void call(int n){char szBuf[1024];std::sprintf(szBuf, "%d", n);boost::thread thread(boost::posix_time::milliseconds(500));std::cout << rcStr << std::endl;}};Callable(), szBuf);thread.detach();}Лекция 824 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПередача локальных буферов в потокиПример (функция потока)Пример (вызов)struct Callable{void operator () (const std::string &rcStr){boost::this_thread::sleep(void call(int n){char szBuf[1024];std::sprintf(szBuf, "%d", n);std::string s(szBuf);boost::posix_time::milliseconds(500));std::cout << rcStr << std::endl;}};boost::thread thread(Callable(), s);thread.detach();}Лекция 824 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПрерывание потоковПримерint main(){// .
. .boost::thread thread3(thread_func2);// . . .thread3.interrupt();}Лекция 825 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПредопределённые точки прерыванияВызовы функцийboost::thread::join()boost::thread::timed_join()boost::condition_variable::wait()boost::condition_variable::timed_wait()boost::condition_variable_any::wait()boost::condition_variable_any::timed_wait()boost::thread::sleep()boost::this_thread::sleep()boost::this_thread::interruption_point()Лекция 826 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки с непрерываемыми участкамиПримерvoid thread_func0(){// .
. .try{// . . .}catch (const boost::thread_interrupted &){// . . .}// . . .}Лекция 827 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки с непрерываемыми участкамиПримерvoid thread_func1(){// . . .{boost::this_thread::disable_interruption di;// . . .{boost::this_thread::disable_interruption di2;// . . .}// .
. .}// . . .Лекция 827 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки с непрерываемыми участкамиПримерvoid thread_func2(){// . . .{boost::this_thread::disable_interruption di;// . . .{boost::this_thread::restore_interruption ri(di);// .
. .}// . . .}// . . .Лекция 827 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование библиотеки мьютексовПример (Boost)#include <boost/thread/mutex.hpp>using namespace boost;Пример (C ++0x)#include <mutex>using namespace std;Лекция 828 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКлассы mutex и recursive_mutexМетоды (владение, блокировка)native_handle_type native_handle();void lock();bool try_lock();void unlock();Лекция 829 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКлассы timed_mutex и recursive_timed_mutexМетоды (владение, блокировка)native_handle_type native_handle();void lock(); bool try_lock(); void unlock();bool timed_lock(system_time const &rcAbsTime);(Boost)template <typename TimeDuration>bool timed_lock(TimeDuration const &rcRelTime);(Boost)template <class Rep, class Period>bool try_lock_for(const chrono::duration <Rep, Period> &rcRelTime);(C ++0x)template <class Clock, class Duration>bool try_lock_until(const chrono::time_point <Clock, Duration> &rcAbsTime);Лекция 8(C ++0x)30 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование библиотеки блокировокПример (Boost)#include <boost/thread/locks.hpp>using namespace boost;Пример (C ++0x)#include <mutex>using namespace std;Лекция 831 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыОпределение lock_guardC ++0xtemplate <class Mutex> class lock_guard{public:typedef Mutex mutex_type;explicit lock_guard(mutex_type &);lock_guard(mutex_type &, adopt_lock_t);~lock_guard();lock_guard(lock_guard const &) = delete;lock_guard &operator = (lock_guard const &) = delete;private:mutex_type &r_Mutex;};Лекция 8// C ++0x// C ++0x32 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование блокировокПримерПример (окончание)class Collection{void Collection::add_value(const Data &rcData){lock_guard <mutex> lock(m_Mutex);m_Vector.push_back(rcData);}// .
. .private:MyVector m_Vector;mutex m_Mutex;};Лекция 833 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыОбщие алгоритмы блокировкиАлгоритмыtemplate <class L1, class L2, class ...
L3>int try_lock(L1 &, L2 &, L3 & ...);(-1, 0, 1, . . . ) (C ++0x)template <class L1, class L2, class ... L3>void lock(L1 &, L2 &, L3 & ...); (C ++0x)Лекция 834 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование нескольких блокировокПример (блокировка двух объектов)bool operator < (const X &rcX1, const X &rcX2){if (&rcX1 == &rcX2)return false;//lock_guard <mutex> lock1(rcX1.m_Mutex);lock_guard <mutex> lock2(rcX2.m_Mutex);//return some_compare(rcX1, rcX2);}Лекция 835 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование нескольких блокировокПример (блокировка двух объектов)bool operator < (const X &rcX1, const X &rcX2){if (&rcX1 == &rcX2)return false;//lock(rcX1.m_Mutex, rcX2.m_Mutex);lock_guard <mutex> lock1(rcX1.m_Mutex, adopt_lock);lock_guard <mutex> lock2(rcX2.m_Mutex, adopt_lock);//return some_compare(rcX1, rcX2);}Лекция 835 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс unique_lockМетоды (создание)unique_lock();explicit unique_lock(mutex_type &);unique_lock(mutex_type &, adopt_lock_t);unique_lock(mutex_type &, defer_lock_t);unique_lock(mutex_type &, try_to_lock_t);Лекция 836 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование нескольких блокировок (unique_lock)Пример (блокировка двух объектов)bool operator < (const X &rcX1, const X &rcX2){if (&rcX1 == &rcX2)return false;//unique_lock <mutex> lock1(rcX1.m_Mutex, defer_lock);unique_lock <mutex> lock2(rcX2.m_Mutex, defer_lock);lock(rcX1.m_Mutex, rcX2.m_Mutex);//return some_compare(rcX1, rcX2);}Лекция 837 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс unique_lock (продолжение)Методы (создание, перемещение)unique_lock(mutex_type &, system_time const &);(Boost)template <class Rep, class Period>unique_lock(mutex_type &, const chrono::duration <Rep, Period> &);(C ++0x)template <class Clock, class Duration>unique_lock(mutex_type &, const chrono::time_point <Clock, Duration> &);(C ++0x)Семантика перемещенияЛекция 838 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс unique_lock (продолжение)Методы (блокировка)void lock();bool try_lock();void unlock();bool timed_lock(system_time const &rcAbsTime);(Boost)template <typename TimeDuration>bool timed_lock(TimeDuration const &rcRelTime);(Boost)template <class Rep, class Period>bool try_lock_for(const chrono::duration <Rep, Period> &rcRelTime);(C ++0x)template <class Clock, class Duration>bool try_lock_until(const chrono::time_point <Clock, Duration> &rcAbsTime);Лекция 8(C ++0x)39 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс unique_lock (окончание)Методы (проверка состояния, освобождение)bool owns_lock() const;operator unspecified_bool_type() const;bool operator ! () const;(Boost)(Boost)explicit operator bool () const;(C ++0x)mutex_type *mutex() const;mutex_type *release();Лекция 840 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс boost::shared_mutexМетоды (разделяемая блокировка)Все методы boost::mutexvoid lock_shared();bool try_lock_shared();bool timed_lock_shared(system_time const &);void unlock_shared();void lock_upgrade();void unlock_upgrade();void unlock_upgrade_and_lock();void unlock_and_lock_upgrade();void unlock_and_lock_shared();void unlock_upgrade_and_lock_shared();Лекция 841 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс boost::shared_lockМетоды (разделяемая блокировка)Все методы boost::unique_lockvoid lock();(вызывает m_pMutex->lock_shared();)и т.