ВУЗ:
Составители:
сматриваемого объема в "занято" после "пробуждения" первого потока, ожидающего освобождения данного объекта. Только
один поток выводится из состояния ожидания, как и в случае с мьютексами. Такое событие называют событием с автомати-
ческим сбросом (auto-reset event).
Параметр bInitialState определяет первоначальное состояние (если TRUE, то "свободно", если FALSE, то "занято") дан-
ного события. Параметру IpName может быть присвоено имя события. Имя предоставляет способ совместного использова-
ния, например посредством функции OpenEvent.
В качестве дополнительного варианта, если нет необходимости иметь дело с вопросами защиты, можно установить
IpEventAttributes в NULL (0&). В таком случае декларация примет следующий вид:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (
ByVal IpEventAttributes As Long, _
By Val bManualReset As Long, _
By Val blmtialState As Long, _
By Val IpName As String _
) As Long
Дескриптор события должен быть закрыт с использованием функции CloseHandle.
Объявление функции OpenEvent:
HANDLE OpenEvent(
DWORD dwDesiredAccess, // Флаг доступа.
BOOL blnheritHandle, // Флаг наследования.
LPCTSTR IpName // Указатель на имя события.
);
Здесь параметр dwDesiredAccess может принимать одно из трех значений:
1) EVENT_ALL_ACCESS предоставляет полный доступ к событию;
2) EVENT_MODIFY_STATE разрешает использование дескриптора события в функциях SetEvent и ResetEvent, так что
вызывающий процесс может изменить состояние данного события (но ничего больше). Это важно для событий со сбросом
вручную;
3) SYNCHRONIZE разрешает использование дескриптора события в любых функциях ожидания (таких как Wait-
ForSingleObject), ждущих освобождения данного объекта.
Каждая из этих функций принимает дескриптор события в качестве аргумента. Функция SetEvent устанавливает со-
стояние данного события в "свободно", a Reset Event "сбрасывает" событие, т.е. присваивает событию статус "занято", функ-
ция PulseEvent вызывает SetEvent для освобождения ожидающих потоков, а затем вызывает ResetEvent для перевода данного
события в состояние "занято".
• Семафоры являются одним из методов синхронизации потоков, в которых применен принцип действия мьютек-
сов, но с добавлением одной существенной детали. В них заложена возможность подсчета ресурсов, что позволяет заранее
определенному числу потоков одновременно войти в синхронизуемый участок кода. Для создания семафора используется
функция CreateSemaphore(), которая объявляется следующим образом:
function CreateSemaphoreflpSemaphoreAttributes: PSecurityAttributes;
llnitialCoimt, iMaximumCount: Longint; IpName: PChar): THandle; stdcall;
Как и в случае функции CreateMutex(), первым параметром, передаваемым функции CreateSemaphore(), является указа-
тель на запись TSecurityAttributes, причем значение Nil соответствует согласию на использование стандартных атрибутов
защиты.
Параметр llnitialCount представляет собой начальное значение счетчика семафорного объекта. Это число может находить-
ся в диапазоне от нуля до значения IMaximumCount. Семафор доступен, если значение этого параметра больше нуля. Когда
поток вызывает функцию WaitForSingleObject() или любую другую, ей подобную, значение счетчика семафора уменьшается
на единицу. И, наоборот, при вызове потоком функции ReleaseSemaphore() значение счетчика семафора увеличивается на
единицу.
С помощью параметра IMaximumCount задается максимальное значение счетчика семафорного объекта. Если семафор
используется для подсчета некоторых ресурсов, это число должно представлять общее количество доступных ресурсов.
Параметр IpName содержит имя семафора. Поведение этого параметра аналогично поведению одноименного параметра
функции CreateMutex().
Функция ReleaseSemaphore (), используемая для увеличения значения счетчика семафора, имеет больше параметров,
чем ее "коллега" ReleaseMutex(). Объявление функции ReleaseSemaphore() выглядит следующим образом:
function ReleaseSemaphore(hSemaphore: THandle; IReleaseCount:
Longint; IpPreviousCount: Pointer): BOOL; stdcall;
С помощью параметра IReleaseCount можно задать число, на которое будет уменьшено значение счетчика семафора.
При этом старое значение счетчика будет сохранено в переменной типа Longint, на которую указывает параметр
IpPreviousCount, если его значение не равно Nil. Скрытый смысл этого средства состоит в том, что семафор никогда не при-
надлежит ни одному отдельному потоку. Предположим, что максимальное значение счетчика семафора было равно 10, и
десять потоков вызвали функцию WaitForSingleObject(). В результате счетчик потоков сбрасывается до нуля и тем самым
семафор переводится в недоступное состояние. После этого достаточно одному из потоков вызвать функцию
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »