- Назначение и свойства потоков управления
- Основные операции над потоками
- Способы реализации потоков
- Работа с потоками управления в ОС Windows
- Работа с потоками управления в ОС Unix
- Потоковая безопасность
Фрагменты из лекции
Назначение потоков управления
- Мультипроцессные системы с разделением времени позволили одновременное (параллельное) выполнение нескольких программ.
- Каждый процесс имеет собственное, защищенное от вмешательства других адресное пространство — собственные данные.
- Нередко требуется параллельная работа нескольких участков кода с общими данными
Поток управления
- Поток управления (нить, thread) — это элемент процесса, который может выполняться на центральном процессоре.
- Процесс начинает свою работу с одного (главного) потока, но может создавать дополнительные.
- Процесс завершает свое выполнение после завершения работы главного потока (независимо от работы дополнительных потоков)
Поток управления
- Каждый из дополнительных потоков управления описывается функцией, которую называют потоковой функцией.
- При создании потока эта функция начинает выполняться (псевдо)параллельно с основной функцией программы.
- С завершением потоковой функции поток прекращает свою работу
Процесс и потоки
Все потоки процесса разделяют общие:
- адресное пространство;
- таблицу открытых файлов;
- глобальные и статические переменные;
- другие ресурсы процесса.
Каждый поток имеет отдельные:
- стек;
- точку выполнения;
- значения локальных переменных.
Основные операции над потоками
- Создание потока
- запуск потоковой функции;
- передача аргументов в потоковую функцию.
- Завершение работы потока
- при завершении потоковой функции;
- по инициативе завершаемого потока;
- по инициативе другого потока.
- Получение возвращенного потоком значения
Способы реализации потоков
1. В ядре системы (ОС Windows)
– преимущества:- планировщик процессора знает о наличии потоков и может учитывать их при планировании процессорного времени;
- блокировка отдельного потока не оказывает влияния на другие потоки процесса.
– недостатки:- на переход в режим ядра и обратно при выполнении операций над потоками требуется время;
- введение потоков нередко значительно снижает стабильность ядра ОС.
2. На уровне пользовательских функций (большинство версий Unix)
– преимущества:- операции над потоками выполняются быстрее;
- не требуют модификации ядра ОС, оно остается простым и, как следствие, стабильным.
– недостатки:- блокировка одного потока может заблокировать весь процесс, т.к. планировщик процессора не знает о наличии в нем других потоков;
- время процессора делится поровну между процессами без учета количества потоков в них.
Работа с потоками управления ОС Windows
- Основные операции над потоками:
- создание — CreateThread
- завершение работы — ExitThread, TerminateThread
- получения кода завершения потока - GetExitCodeThread
Создание потока
– HANDLE — дескриптор созданного потока
● CreateThread(
– LPSECURITY_ATTRIBUTES — атрибуты безопасности, обычно NULL,
– SIZE_T - начальный размер стека, 0 — размер по умолчанию,
– LPTHREAD_START_ROUTINE — потоковая функция,
– LPVOID — параметр, передаваемый в потоковую функцию,
– DWORD — флаги, CREATE_SUSPENDED чтобы поток не начинал выполнение сразу (впоследствии он запускается через ResumeThread),
– LPDWORD — адрес для получения идентификатора потока, NULL если не нужно
)
Завершение работы потока
– void - функция не возвращается
● ExitThread(
– DWORD — код завершения потока
)
– BOOL — 0 если неудачно, иначе не 0
● TerminateThread(
– HANDLE — дескриптор завершаемого потока,
– DWORD — код завершения потока
)
Потоки в ОС Unix
- Концепция потоков появилась позднее создания базового ядра Unix, поэтому реализация потоков в различных версиях ОС различалась.
- При разработке стандарта POSIX были разработаны POSIX-потоки (pthread), поддерживаемые большинством современных unix-систем.
- При компиляции программы с использованием POSIX-потоков необходимо указать ключ - lpthread
Потоковая безопасность
- Функция называется потоково-безопасносной (thread safe), если (псевдо)параллельное выполнение этой функции в нескольких потоках не может нарушить работу программы.
- Функция является потоково-безопасной, если
- она использует только локальные переменные, и указатели только на выделенную ею память;
- если работа с глобальнами и статическими переменными, а также получаемыми указателями, синхронизирована;
- функция может не допускать одновременных запусков, блокируя свою работу с помощью критической секции или мьютекса.
Части CRT, не являющиеся потоково-безопасными
- Библиотека CRT создавалась задолго до появления концепции потоков, поэтому не является потоково-безопасной.
- Небезопасной при многопоточной работе является обработка ошибок, поскольку она использует глобальную переменную errno
- Небезопасной при многопоточной работе является, например, функция strtok, т.к. для хранения состояния между запусками она использует статические переменные.