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