Слайд 2Потоки
Поток – абстрактная единица выполнения кода программы, создаваемая ядром ОС. Одному процессу
![Потоки Поток – абстрактная единица выполнения кода программы, создаваемая ядром ОС. Одному](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-1.jpg)
может принадлежать несколько потоков, разделяющих его ресурсы, например, память. Все потоки, принадлежащие процессу разделяют его адресное пространство, последовательность инструкций (код), стек вызовов и его контекст(данные). Процессу принадлежит минимум один поток, называемый главным потоком.
Слайд 3Стек вызовов – структура данных, организованная по принципу LIFO(Last in First out
![Стек вызовов – структура данных, организованная по принципу LIFO(Last in First out](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-2.jpg)
– последний пришел первый вышел), хранящая адреса для возврата управления из подпрограмм в подпрограмму(при рекурсивном вызове функции) или в основную программу.
Слайд 4Класс thread
thread - Определяет объект, который позволяет наблюдать за потоком выполнения в
![Класс thread thread - Определяет объект, который позволяет наблюдать за потоком выполнения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-3.jpg)
приложении и управлять этим потоком. Для работы с ним необходимо включить заголовочный файл thread. Находится в пространстве имен std.
Пример объявления и инициализации:
Слайд 5Класс thread
Для управления выполнением потока используются следующие функции:
join( );
detach( );
join( ) –
![Класс thread Для управления выполнением потока используются следующие функции: join( ); detach(](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-4.jpg)
заставляет вызывающий функцию поток дождаться конца выполнения указанного потока в момент вызова – блокирует его.
detach( ) – указывает, что дожидаться конца выполнения не обязательно – отсоединяет указанный поток от объекта thread. ОС становится ответственной за освобождение ресурсов.
При создании потока обязательным является указать один из способов управления созданного потока, в противном случае будет вызвано исключение.
Слайд 6Примеры применения функций управления потоком:
![Примеры применения функций управления потоком:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-5.jpg)
Слайд 7Примеры применения функций управления потоком:
![Примеры применения функций управления потоком:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-6.jpg)
Слайд 8Передача параметров в функцию, выполняемую в другом потоке
Входные параметры для функции передаются
![Передача параметров в функцию, выполняемую в другом потоке Входные параметры для функции](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-7.jpg)
в инициализатор потока через запятую.
Пример:
Слайд 9Получение результата выполнения
Получение результат выполнения функции из другого потока выполняется с помощью
![Получение результата выполнения Получение результат выполнения функции из другого потока выполняется с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-8.jpg)
лямбда-функции(анонимного метода) по ссылке.
Пример:
Слайд 12Потокобезопасность
При использовании многопоточного программирования часто случается так, что несколько потоков используют один
![Потокобезопасность При использовании многопоточного программирования часто случается так, что несколько потоков используют](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-11.jpg)
и тот же ресурс или набор данных. В подобных случаях нередко возникает явление «гонки», когда каждый поток производит свои операции над теми же данными. Такая ситуация приводит к неожиданным результатам.
Слайд 13Потокобезопасность
Для предотвращения состояний «гонки» применяются несколько подходов:
Использование мьютексов (mutex – mutual exclusion
![Потокобезопасность Для предотвращения состояний «гонки» применяются несколько подходов: Использование мьютексов (mutex –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-12.jpg)
– взаимное исключение)
Мьютекс – примитив синхронизации, блокирующий выполнение участка кода. Имеет два состояния: разблокирован и заблокирован. Поток, заблокировавший мьютекс ответственен за его разблокировку.
Атомарные операции – операции, выполняющиеся за один такт
Слайд 14Мьютексы
Чтобы использовать мьютексы необходимо подключить заголовочный файл mutex.
В языке программирования C++ существует
![Мьютексы Чтобы использовать мьютексы необходимо подключить заголовочный файл mutex. В языке программирования](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1175135/slide-13.jpg)
несколько разновидностей мьютексов, разделенные по назначению:
mutex – базовый тип мьютекса
recursive_mutex – используется для рекурсивных вызовов подпрограмм
lock_guard – «обёртка» базового мьютекса, разблокирует его при выходе за скобки
unique_lock – более гибки вариант lock_guard