Создание и управление потоками, параллельная обработка потоков C++

Содержание

Слайд 2

Потоки

Поток – абстрактная единица выполнения кода программы, создаваемая ядром ОС. Одному процессу

Потоки Поток – абстрактная единица выполнения кода программы, создаваемая ядром ОС. Одному
может принадлежать несколько потоков, разделяющих его ресурсы, например, память. Все потоки, принадлежащие процессу разделяют его адресное пространство, последовательность инструкций (код), стек вызовов и его контекст(данные). Процессу принадлежит минимум один поток, называемый главным потоком.

Слайд 3

Стек вызовов – структура данных, организованная по принципу LIFO(Last in First out

Стек вызовов – структура данных, организованная по принципу LIFO(Last in First out
– последний пришел первый вышел), хранящая адреса для возврата управления из подпрограмм в подпрограмму(при рекурсивном вызове функции) или в основную программу.

Слайд 4

Класс thread

thread - Определяет объект, который позволяет наблюдать за потоком выполнения в

Класс thread thread - Определяет объект, который позволяет наблюдать за потоком выполнения
приложении и управлять этим потоком. Для работы с ним необходимо включить заголовочный файл thread. Находится в пространстве имен std.
Пример объявления и инициализации:

Слайд 5

Класс thread

Для управления выполнением потока используются следующие функции:
join( );
detach( );
join( ) –

Класс thread Для управления выполнением потока используются следующие функции: join( ); detach(
заставляет вызывающий функцию поток дождаться конца выполнения указанного потока в момент вызова – блокирует его.
detach( ) – указывает, что дожидаться конца выполнения не обязательно – отсоединяет указанный поток от объекта thread. ОС становится ответственной за освобождение ресурсов.
При создании потока обязательным является указать один из способов управления созданного потока, в противном случае будет вызвано исключение.

Слайд 6

Примеры применения функций управления потоком:

Примеры применения функций управления потоком:

Слайд 7

Примеры применения функций управления потоком:

Примеры применения функций управления потоком:

Слайд 8

Передача параметров в функцию, выполняемую в другом потоке

Входные параметры для функции передаются

Передача параметров в функцию, выполняемую в другом потоке Входные параметры для функции
в инициализатор потока через запятую.
Пример:

Слайд 9

Получение результата выполнения

Получение результат выполнения функции из другого потока выполняется с помощью

Получение результата выполнения Получение результат выполнения функции из другого потока выполняется с
лямбда-функции(анонимного метода) по ссылке.
Пример:

Слайд 12

Потокобезопасность

При использовании многопоточного программирования часто случается так, что несколько потоков используют один

Потокобезопасность При использовании многопоточного программирования часто случается так, что несколько потоков используют
и тот же ресурс или набор данных. В подобных случаях нередко возникает явление «гонки», когда каждый поток производит свои операции над теми же данными. Такая ситуация приводит к неожиданным результатам.

Слайд 13

Потокобезопасность

Для предотвращения состояний «гонки» применяются несколько подходов:
Использование мьютексов (mutex – mutual exclusion

Потокобезопасность Для предотвращения состояний «гонки» применяются несколько подходов: Использование мьютексов (mutex –
– взаимное исключение)
Мьютекс – примитив синхронизации, блокирующий выполнение участка кода. Имеет два состояния: разблокирован и заблокирован. Поток, заблокировавший мьютекс ответственен за его разблокировку.
Атомарные операции – операции, выполняющиеся за один такт

Слайд 14

Мьютексы

Чтобы использовать мьютексы необходимо подключить заголовочный файл mutex.
В языке программирования C++ существует

Мьютексы Чтобы использовать мьютексы необходимо подключить заголовочный файл mutex. В языке программирования
несколько разновидностей мьютексов, разделенные по назначению:
mutex – базовый тип мьютекса
recursive_mutex – используется для рекурсивных вызовов подпрограмм
lock_guard – «обёртка» базового мьютекса, разблокирует его при выходе за скобки
unique_lock – более гибки вариант lock_guard