Составители:
Независимо от того, как - явно или неявно (в результате выполнения оператора re-
turn) - вызывается функция ExitThread, она удаляет поток из очереди программы-
планировщика и уничтожает его стек. Однако сам объект при этом сохраняется. Поэто-
му даже после прекращения выполнения потока вы можете запросить его код заверше-
ния. По возможности дескриптор потока следует закрывать явно (с помощью функций
CloseHandle), с тем чтобы поток не занимал лишний объем памяти. При закрытии по-
следнего дескриптора система автоматически уничтожает поток. Система не может
уничтожить выполняющийся поток, даже если закрыты все его дескрипторы. В этом
случае поток будет уничтожен сразу же после завершения выполнения. Если по завер-
шении процесса остаются незакрытые дескрипторы, система закрывает их автоматиче-
ски и удаляет все "подвешенные" объекты, которые не принадлежат ни одному процес-
су.
С помощью команды ExitThread поток может остановить себя самостоятельно в
том месте программы, где это необходимо. Кроме того, один поток способен по своему
усмотрению мгновенно остановить другой поток.
// с помощью вызова этой функции один поток может остановить другой
BOOL TerminateThread ( HANDLE hThread, DWORD dwExitCode );
Поток не в состоянии защитить себя от прерывания. Имея соответствующий деск-
риптор, любой объект может мгновенно остановить поток вне зависимости от его теку-
щего состояния (конечно, в том случае; если дескриптор разрешает полный доступ к по-
току). Если при вызове функции CreateThread использовать набор атрибутов
безопасности, заданный по умолчанию, то результирующий дескриптор обеспечит пол-
ные привилегии доступа к созданному потоку.
Функция TerminateThread не уничтожает стек потока, а только возвращает код его
завершения. Функции ExitThread и TerminateThread переводят объект в сигнальное со-
стояние, что служит признаком возможности запуска других потоков, ожидавших его
завершения. После выполнения любой из двух указанных функций поток продолжает
существовать в сигнальном состоянии до тех пор, пока не будут закрыты все его деск-
рипторы.
2.2.3. Синхронизация потоков
При работе с потоками необходимо иметь возможность координировать их дейст-
вия. Часто координация действий подразумевает определенный порядок выполнения
операций. Кроме функций, предназначенных для создания потоков и изменения их пла-
нового приоритета, Win32 API содержит функции, которые переводят потоки в режим
ожидания сигналов от определенных объектов, например от файлов или процессов.
Кроме того, эти функции обеспечивают поддержку некоторых специальных объектов, в
частности семафоров и исключающих семафоров.
Лучше всего проиллюстрировать применение синхронизирующих объектов можно
на примере функций, ожидающих сигнала от объекта. С помощью одного набора обоб-
щенных команд можно организовать ожидание сигналов от процессов, семафоров, ис-
ключающих семафоров, событий и некоторых других объектов. Следующая функция
ожидает поступления сигнала от указанного объекта:
DWORD WaitForSingleObject( HANDLE hObject, // объект, сигнал от
// которого ожидается
DWORD dwMilliseconds ); // максимальное время ожидания
70
Независимо от того, как - явно или неявно (в результате выполнения оператора re-
turn) - вызывается функция ExitThread, она удаляет поток из очереди программы-
планировщика и уничтожает его стек. Однако сам объект при этом сохраняется. Поэто-
му даже после прекращения выполнения потока вы можете запросить его код заверше-
ния. По возможности дескриптор потока следует закрывать явно (с помощью функций
CloseHandle), с тем чтобы поток не занимал лишний объем памяти. При закрытии по-
следнего дескриптора система автоматически уничтожает поток. Система не может
уничтожить выполняющийся поток, даже если закрыты все его дескрипторы. В этом
случае поток будет уничтожен сразу же после завершения выполнения. Если по завер-
шении процесса остаются незакрытые дескрипторы, система закрывает их автоматиче-
ски и удаляет все "подвешенные" объекты, которые не принадлежат ни одному процес-
су.
С помощью команды ExitThread поток может остановить себя самостоятельно в
том месте программы, где это необходимо. Кроме того, один поток способен по своему
усмотрению мгновенно остановить другой поток.
// с помощью вызова этой функции один поток может остановить другой
BOOL TerminateThread ( HANDLE hThread, DWORD dwExitCode );
Поток не в состоянии защитить себя от прерывания. Имея соответствующий деск-
риптор, любой объект может мгновенно остановить поток вне зависимости от его теку-
щего состояния (конечно, в том случае; если дескриптор разрешает полный доступ к по-
току). Если при вызове функции CreateThread использовать набор атрибутов
безопасности, заданный по умолчанию, то результирующий дескриптор обеспечит пол-
ные привилегии доступа к созданному потоку.
Функция TerminateThread не уничтожает стек потока, а только возвращает код его
завершения. Функции ExitThread и TerminateThread переводят объект в сигнальное со-
стояние, что служит признаком возможности запуска других потоков, ожидавших его
завершения. После выполнения любой из двух указанных функций поток продолжает
существовать в сигнальном состоянии до тех пор, пока не будут закрыты все его деск-
рипторы.
2.2.3. Синхронизация потоков
При работе с потоками необходимо иметь возможность координировать их дейст-
вия. Часто координация действий подразумевает определенный порядок выполнения
операций. Кроме функций, предназначенных для создания потоков и изменения их пла-
нового приоритета, Win32 API содержит функции, которые переводят потоки в режим
ожидания сигналов от определенных объектов, например от файлов или процессов.
Кроме того, эти функции обеспечивают поддержку некоторых специальных объектов, в
частности семафоров и исключающих семафоров.
Лучше всего проиллюстрировать применение синхронизирующих объектов можно
на примере функций, ожидающих сигнала от объекта. С помощью одного набора обоб-
щенных команд можно организовать ожидание сигналов от процессов, семафоров, ис-
ключающих семафоров, событий и некоторых других объектов. Следующая функция
ожидает поступления сигнала от указанного объекта:
DWORD WaitForSingleObject( HANDLE hObject, // объект, сигнал от
// которого ожидается
DWORD dwMilliseconds ); // максимальное время ожидания
70
Страницы
- « первая
- ‹ предыдущая
- …
- 66
- 67
- 68
- 69
- 70
- …
- следующая ›
- последняя »
