Потоковая безопасность (презентация)
Описание файла
PDF-файл из архива "Потоковая безопасность (презентация)", который расположен в категории "". Всё это находится в предмете "параллельные системы и параллельные вычисления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "параллельные системы и параллельные вычисления" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковНазваниеЛекция 8. Потоковая безопасностьПроектирование ПО на C ++21 декабря 2010 г.Лекция 81 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Потоковая безопасностьОпределениеПотоковая безопасность: (Thread Safety) — свойство кода, предполагающееего корректное функционирование при одновременномисполнении несколькими потоками.Основные методыАтомарные операции.Взаимное исключение.Реентрабельность.Локальное хранилище потока.Лекция 82 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Потоковая безопасностьОпределениеПотоковая безопасность: (Thread Safety) — свойство кода, предполагающееего корректное функционирование при одновременномисполнении несколькими потоками.Основные методыАтомарные операции.Взаимное исключение.Реентрабельность.Локальное хранилище потока.Лекция 82 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++РеентрабельностьОпределениеРеентрабельность: (Reentrancy) — свойство функции или программы,предполагающее её корректный повторный вызов во времяисполнения (например, рекурсивный).Лекция 83 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Требования к реентрабельной функцииРеентрабельная функцияНе должна работать со статическими/глобальными неконстантнымиданными.Не должна возвращать адрес статических/глобальных неконстантныхданных.Должна работать только с данными, переданными вызывающей сторонойНе должна опираться на блокировки глобальных ресурсов (Singleton).Не должна модифицировать своего кода.Не должна вызывать нереентрабельных программ или процедур.Лекция 84 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Локальное хранилище потокаОпределениеЛокальное хранилище потока: (Thread-local storage, TLS) — наборстатических/глобальных переменных, локальных по отношениюк использующему их потоку.Лекция 85 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательностиПримерint main(){int i =cout<< (i<< (i<< (i0;+= 1) << ’ ’+= 1) << ’ ’+= 1) << endl;}Лекция 86 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательностиПримерint main(){int i = 0;cout.operator << (i += 1).operator << (i += 1).operator << (i += 1);}Лекция 86 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательностиПримерint main(){int i = 0;x.f1(++ i).f2(++ i).f3(++ i);}Лекция 86 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательностиПримерint main(){int i = 0;// x.f1(++ i).f2(++ i).f3(++ i);f3(f2(f1(x, ++ i), ++ i), ++ i);}Лекция 86 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательности (продолжение)Определение (C ++98, C ++03)Точка последовательности: (Sequence Point) — место программы, в которомвсе побочные эффекты от предыдущих вычислений должнызавершиться, а от последующих — ещё не начаться.Лекция 87 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Точка последовательности (окончание)Точки последовательностиОкончание вычисления полного выражения;После завершения вычисления аргументов функции до началавыполнения её тела.После копирования возвращаемого значения функции до вычислениялюбых выражений вне её.После вычисления первого выражения в:expr1 && expr2expr1 || expr2expr1, expr2expr1 ? expr2 : expr3Лекция 88 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Многопоточность в C ++0xИзмененияВ модель исполнения программы добавлено понятие многопоточности.Условия гонок за данными отмечены как приводящие к неопределённомуповедению программы.Определение точек последовательности (Sequence Points) заменено наотношение предшествования вычисления (Sequenced before).Добавлен класс хранения thread_local с возможностью динамическойинициализации.Лекция 89 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПроблемы многопоточностиРеентрабельностьЛокальное хранилище потокаПоддержка многопоточности в C ++Использование библиотеки потоковПримерthread_local int gt_n = 0;void thread_func(){static thread_local int st_n = ++ gt_n;// .
. .}Лекция 810 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПрежний подход к программированию потоковПример (базовый класс)Пример (пользовательский класс)class Thread{public:void Run();bool IsRunning() const;class MyThread : public Thread{protected:virtual void OnExecute();private:// . . .Data m_Data1;protected:virtual void OnExecute() = 0;};Лекция 8// . . .}11 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование библиотеки потоковПример (Boost)#include <boost/thread/thread.hpp>using namespace boost;Пример (C ++0x)#include <thread>using namespace std;Лекция 812 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПространство имён this_threadОбщие методыthread::id get_id()void yield()Лекция 813 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПространство имён this_thread, функции снаBoosttemplate <typename TimeDuration>void sleep(TimeDuration const &rcTime);C ++0xtemplate <class Clock, class Duration>void sleep_until(const chrono::time_point <Clock, Duration> &);template <class Rep, class Period>void sleep_for(const chrono::duration<Rep, Period> &);Лекция 814 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс threadМетоды (создание, перемещение)thread();template <typename Callable> [explicit ]thread(Callable func);template <class F, class A1, class A2, ...>thread(F f, A1 a1, A2 a2, ...); (Boost, до 9template <class F, class ...
Args>thread(F &&, Args && ...); (C ++0x,параметров)variadic template parameters)Семантика перемещения, обмен.Лекция 815 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыШаблоны с переменным количеством параметровОпределение std::tuple <> (C ++0x)template <> class tuple <>{public:void swap(tuple &&){// Пусто}};Лекция 816 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыШаблоны с переменным количеством параметровОпределение std::tuple (C ++0x)template <typename Head, typename ...
Tail>class tuple <Head, Tail ...> : private tuple <Tail ...>{typedef tuple <Tail ...> inherited;protected:Head m_head;public:tuple(typename add_const_reference <Head>::type rcH,typename add_const_reference <Tail>::type ... rcT): m_head(rcH), inherited(rcT ...) { }typename add_reference <Head>::type head() { return m_head; }inherited &tail() { return *this; }// . .
.Лекция 817 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование списков типовПример#include <tuple>// . . .using namespace std;int main(){string s = "Hello";vector <int> v = {1, 22, 3, 4, 5};auto x = make_tuple(s, v, 1.2);// ∼ tuple <string, vector <int>, double> x = ...cout << get <0> (x) << endl;// . . .Лекция 818 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыРекурсивная обработка списков (Пролог)Примерall_positive([]).all_positive([Head | Tail]) :Head > 0,all_positive(Tail).Пример (запрос)?- all_positive([3, 1, 5]).yesЛекция 819 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыКласс thread (окончание)Методы (владение, слияние)void detach();thread::id get_id() const;native_handle_type native_handle();bool joinable() const; (get_id() != id())void join();bool timed_join(const system_time &rcAbsTime);(Boost)template <typename TimeDuration>bool timed_join(TimeDuration const &rcRelTime);(Boost)static unsigned hardware_concurrency();Лекция 820 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыИспользование потоковПримерПример (окончание)#include <boost/thread/thread.hpp>using namespace boost;void thread_func(){int main(){// .
. .// . . .}thread thread1(thread_func);// . . .struct ThreadData{Data m_Data;void operator () ();};ThreadData data;thread thread2(data);// . . .}Лекция 821 / 55НачалоИспользование многопоточностиБиблиотеки многопоточностиСпособы обеспечения безопасности потоковПотокиМьютексыБлокировкиУсловные переменные, барьерыПотоки на некопируемых объектахПримерПример (окончание)struct Callable{Callable() {}int main(){// . . .void operator () (){Callable callable;boost::thread thread1(boost::ref(callable));// .