
- •Процессы, нити и волокна
- •CrProces.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •Объекты синхронизации
- •Защита процесса от нереентрабельного кода
- •Описание функций управления процессами, нитями и волокнами
- •CreateEvent
- •CrEvent.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateMutex
- •CrMutex.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateSemaphore
- •CrSem.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateThread
- •EnterCriticalSection
- •EntCrSec.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •ExitThread
- •InitializeCriticalSection
- •DeleteCriticalSection
- •LeaveCriticalSection
- •OpenSemaphore
- •TryEnterCriticalSection
- •WaitForMultipleObjects
OpenSemaphore
Описание Функция OpenSemaphore открывает существующий поименованный объект семафора. Семафор может быть предварительно создан с использованием CreateSemaphore. Если дескриптор, возвращаемый функцией, уже не требуется, для его закрытия следует воспользоваться функцией CloseHandle.
Синтаксис HANDLE OpenSemaphore(DWORD dwAccessFlag, BOOL bInherit, LPCTSTR lpszSemName)
Параметры dwAccessFlag DWORD: Требуемый тип доступа к объекту семафора. bInherit BOOL: Если дескриптор семафора может наследоваться порожденными процессами, этот параметр должен быть равен TRUE , а в противном случае - FALSE. lpszSemName LPCTSTR: Указатель на строку, завершающуюся нулевым символом и содержащую имя семафора с учетом регистра.
Возвращаемое значение HANDLE: Если выполнение функции оказывается успешным, возвращается дескриптор семафора. В противном случае возвращается NULL. Для возврата расширенной информации об ошибке используется функция GetLastError.
Включаемый файл winbase.h
См. также DuplicateHandle, OpenEvent, OpenMutex, CreateSemaphore, CloseHandle.
Пример См. пример применения функции CreateSemaphore.
TryEnterCriticalSection
Описание Функция TryEnterCriticalSection предпринимает попытку войти в критический участок кода без блокировки. Если вызов этой функции окажется успешным, тогда вызывающая нить приобретет права владения критическим участком кода. В противном случае осуществляется немедленный возврат из данной функции.
Синтаксис DWORD TryEnterCriticalSection (LPCRITICAL_SECTION lpCriticalSection)
Параметры lpCriticalSection LPCRITICAL_SECTION: Объект критического участка кода.
Возвращаемое значение DWORD: Если вход в критический участок кода будет успешным либо текущая нить уже владеет этим критическим участком кода, возвращается ненулевое значение. Если критический участок кода уже принадлежит другой нити, возвращается 0.
Включаемый файл winbase.h
См. также DeleteCriticalSection, EnterCriticalSection, InitializeCriticalSection, LeaveCriticalSection.
WaitForMultipleObjects
Описание Функция WaitForMultipleObjects представляет собой функцию ожидания, которая осуществляет возврат только в случае, когда любой или все перечисленные объекты переходят в сигнальные состояния либо истекает указанный период времени ожидания.
Синтаксис DWORD WaitForMultipleObjects(DWORD dwObjectCount, CONST HANDLE* lphObjectList, BOOL bWaitAll, DWORD dwTimeoutInterval)
Параметры dwObjectCount DWORD: Количество дескрипторов объектов в массиве lphObjectList. Максимально допустимое число дескрипторов объектов равно MAXIMUM_WAIT_OBJECTS. lphObjectList CONST HANDLE*: Указатель на массив дескрипторов объектов. У всех дескрипторов должны быть права доступа типа SYNCHRONIZE. bWaitAll BOOL: Если установлено значение FALSE, выполняется ожидание перехода в сигнальное состояние любого объекта, а если TRUE – то всех объектов. dwTimeoutInterval DWORD: Если установлено значение 0, проверяется состояние всех объектов и сразу же осуществляется возврат из функции. Если же установлено значение INFINITE, время ожидания не используется. Иначе параметр определяет число миллисекунд времени ожидания.
Возвращаемое значение DWORD: Если выполнение функции оказывается успешным, возвращаемое значение определяет объект, который обусловил возврат из данной функции ожидания. В противном случае возвращается WAIT_FAILED. Для возврата кода ошибки используется функция GetLastError. Возможные значения возврата сведены в табл. 4.
Таблица 4 Типы объектов, используемых в функции WaitForMultipleObjects
Объект |
Описание |
|
Уведомление об изменении |
Этот дескриптор возвращает FindFirstChangeNotification |
|
Ввод с консоли |
Этот дескриптор возвращает CreateFile или GefStdHandle |
|
Событие |
Этот дескриптор возвращает CreateEvent или OpenEvent |
|
Мьютекс |
Этот дескриптор возвращает CreateMutex или OpenMutex |
|
Процесс |
Этот дескриптор возвращает CreateProcess или OpenProcess |
|
Семафор |
Этот дескриптор возвращает CreateSemaphore или OpenSemaphore |
|
Нить |
Этот дескриптор возвращает CreateProcess, CreateThread или CreateRemoteThread |
|
Таймер |
Этот дескриптор возвращает CreateWaitableTimer или OpenWaitableTimer |
Включаемый файл winbase.h
См. также WaitForSingleObject.
Пример См. пример применения функции TlsAlloc.
Таблица 5 Значения, возвращаемые функцией WaitForMuItipleObjects
Возвращаемое значение |
Что означает |
TRUE |
Все объекты находятся в сигнальном состоянии, а значение параметра bWaitAII равно TRUE |
WAIT_OBJECT_0 – WAIT_OBJECT 0 + dwObjectCount-1 |
Первый объект находится в сигнальном состоянии, а значение параметра bWaitAll равно FALSE |
WAIT_ABANDONED_0 ~ WAIT_ ABANDONED 0 + dwObjectCount-1 |
Первый мьютекс отвергнут, а значение параметра bWaitAII равно FALSE |
WAIT_TIMEOUT |
Время ожидания истекло до того, как объекты смогли удовлетворить условию ожидания |