Главная arrow С++ (часть 3) arrow Обзор поточных функций в Windows

Обзор поточных функций в Windows

Операционная система Windows предлагает широкий набор API-функций (Application Programming Interface, Интерфейс прикладного программирования), поддерживающих многопоточность. Большинство читателей знают их в той или иной мере; для тех же, кто не знаком с ними, далее представлен обзор API-функций, используемых в примерах этой главы. Помните, что Windows предлагает множество других обеспечивающих многопоточность функций, которые вы сможете применять в самостоятельной работе.
Для использования API-функций, обеспечивающих многопоточность, вы должны включить в программу файл <windows.h>.
Создание и завершение потока
Для создания потока применяют API-функцию createThread (). Ее прототип приведен далее:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES secAttr, SIZE_T stackSize,
LPTHTHREAD_START_ROUTINE threadFunc, LPVOID param, DWORD flags, LPDWORD threadID);
secAttr — указатель на множество параметров защиты, принадлежащих потоку. Если значение указателя secAttr равно NULL, то применяется дескриптор защиты по умолчанию (default security descriptor).
У каждого потока есть свой стек (stack). Вы можете задать для нового потока размер стека в байтах, используя параметр stacksize. Если его целое значение равно нулю, новый поток получит стек, по размеру равный создаваемому потоку. В этом случае стек будет расширяться при необходимости (указание нуля для размера стека — стандартный прием).
Каждый поток выполнения начинается с вызова внутри создаваемого процесса функции, называемой функцией потока (thread function). Выполнение потока продолжается до возврата функции потока в вызывающую программу. Адрес этой функции (это точка входа потока (thread entry)) задается в параметре threadFunc. Все функции потока должны соответствовать следующему прототипу:
DWORD WINAPI threadfunc(LPVOID param);
Любой аргумент, который вы хотите передать потоку, указывается в параметре param функции CreateThread (). Функция ПОТОКа Получает ЭТО 32-битное значение в виде параметра. Его можно использовать для разных целей. Функция возвращает код состояния (exit status).
Параметр flags определяет состояние выполнения потока. Если он равен нулю, то поток начнет выполняться немедленно. Если его значение — CREATE_SUSPEND, поток создается в отложенном состоянии, в ожидании выполнения (он может начать выполнение с помощью вызова функции
ResumeThread (), обсуждаемой ПОЗДНве).
Идентификатор, связанный с потоком, возвращается в длинном целом, на которое указывает параметр threadiD.
Функция возвращает дескриптор потока при успешном завершении или NULL при возникновении ошибки. Дескриптор потока (thread handle) можно уничтожить явно, вызвав функцию cioseThreado. В противном случае он будет уничтожен автоматически, когда закончится родительский процесс. Как уже отмечалось, поток выполнения завершается, когда соответствующая ему функция потока возвращается в вызывающую программу. Процесс может
завершить ПОТОК самостоятельно С ПОМОЩЬЮ фуНКЦИЙ TerminateThreadO И
ExitThread(), прототипы которых приведены далее.
BOOL TerminateThread(HANDLE thread, DWORD status); VOID ExitThread(DWORD status);
У функции TerminateThreadO параметр thread — это дескриптор завершаемого потока. Функция ExitThreadO может завершить только тот поток, который ее вызывает. Параметр status в обеих функциях — статус завершения. Функция TerminateThreadO возвращает ненулевое значение при успешном завершении и нулевое в противном случае.
Вызов функции ExitThreado функционально эквивалентен нормальному завершению функции потока. Это значит, что стек соответствующим образом
Сброшен. ЕСЛИ же ПОТОК завершается С ПОМОШЬЮ функции TerminateThreadO,
он останавливается немедленно и не выполняет никакой специальной очистки стека. Кроме того, последний вариант завершения может остановить поток время выполнения важной операции. Поэтому лучше (да и легче) дать потоку завершиться нормально, когда вернется в программу его функция.