Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка к лабораторным работам (рус).doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
353.79 Кб
Скачать

1.3.3. Создание и завершение потока Поток создается вызовом функции

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes ,

DWORD dwStackSize ,

LPTHREAD_START_ROUTINE lpStartAddress ,

LPVOID lpParameter ,

DWORD dwCreationFlags ,

LPDWORD lpThreadId

);

Первый параметр lpThreadAttributes определяет атрибуты безопасности для запускаемого потока. Если он равен NULL, то данный поток не может использоваться дочерними процессами. В противном случае необходимо инициализировать структуру SECURITY_ATTRIBUTES:

typedef struct _SECURITY_ATTRIBUTES {

DWORD nLength;

LPVOID lpSecurityDescriptor;

BOOL bInheritHandle;

} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

Особенности ее использования рассмотрены в предыдущих лекциях.

Второй параметр dwStackSize определяет, какую часть адресного пространства поток сможет использовать под свой стек. Если это значение нулевое, то выделяется размер стека, установленный по умолчанию в компоновщике программы.

Третий параметр определяет начальный адрес потока (фактически - имя процедуры потока), например:

DWORD WINAPI Thread1(PVOID pvoid)

{

// Текст потока

}

. . . . .

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1, …);

Четвертый параметр lpParameter является целым числом, которое передается создаваемому потоку как параметр (PVOID pvoid). Часто в качестве данного параметра выступает указатель на число или некоторую структуру данных. Таким образом, основной процесс имеет возможность передавать в поток необходимую стартовую информацию.

Пятый параметр определяет дополнительные флаги, управляющие созданием потока. Если этот параметр равен нулю, то поток создастся немедленно. Если этот параметр равен CREATE_SUSPENDED, система создает поток, инициализирует его и приостанавливает до последующих указаний. Активизировать созданный поток в этом случае можно при помощи функции :

DWORD ResumeThread( HANDLE hThread );

Последний параметр является адресом переменной, в которую возвращается идентификатор потока.

Поток можно завершить четырьмя способами:

  1. функция потока возвращает управление (рекомендуемый способ);

  2. поток самоуничтожается вызовом функции ExitThread (нежелательный способ):

VOID ExitThread( DWORD dwExitCode );

  1. один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ).

BOOL TerminateThread( HANDLE hThread , DWORD dwExitCode );

  1. завершается процесс, содержащий данный поток (тоже нежелательно).

Нежелательность некоторых способов объясняется тем, что при их осуществлении может происходить потеря областей памяти, которые поток создал в процессе своей работы и не закрыл до момента принудительного завершения.

1.3.4. Приостановка и возобновление потоков

При создании объекта "поток", счетчик числа простоев устанавливается в 1, что позволяет не выделять процессорное время данному потоку до момента его полной инициализации. После завершения инициализации, счетчик простоев обнуляется, и если при создании потока не был установлен флаг CREATE_SUSPENDED, поток включается в список тех, кому предоставляется процессорное время. В случае, если флаг установлен, поток ожидает выполнения функции:

DWORD ResumeThread(HANDLE hThread);

Если вызов функции прошел успешно, она возвращает предыдущее значение счетчика простоев, в ином случае – 0хFFFFFFFF.

Выполнение отдельного потока можно приостановить несколько раз при помощи вызова функции

DWORD SuspendThread(HANDLE hThread).

Любой поток может выполнить эту функцию и приостановить выполнение другого потока. Кроме того, сам поток может приостановить себя (а запустить - нет). Если функция была применена к потоку SuspendThread несколько раз, то счетчик простоев увеличивается соответственно на количество вызовов функции. Для возобновления выполнения потока необходимо выполнить столько же раз функцию ResumeThread. По аналогии функция SuspendThread возвращает предыдущее состояние счетчика повторений.