Азбука программирования в Win32 API


Азбука программирования в Win32 API - стр. 197


Второй аргумент определяет, наследуют ли этот семафор другие про­цессы, создаваемые функцией CreateProcessQ. Значение TRUE говорит о том, что семафор является наследуемым.

Главным аргументом в этой функции является третий аргумент, опре­деляющий имя открываемого семафора. Если функция выполняется успешно, то она возвращает хэндл открытого семафора.

Созданный или открытый семафор можно использовать с помощью функции WaitForSingleObject(), описание которой, приведенное ниже, можно найти в файле winbase.h:

236

WINBASEAPI DWORD WINAPI WaitForSingleObject(HANDLE hHandle,

DWORD dwMilliseconds);

Первый аргумент функции очевиден - хэндл семафора. Второй аргу­мент определяет время ожидания наступления события в миллисекундах. Если это значение равно 0, то функция сразу же прекращает ожидание и возвращает управление. Если время ожидания определено как INFINITE, то ожидание наступления события не прекращается. Функция может вернуть значения, приведенные в табл. 56.

Алгоритм работы с семафорами выглядит следующим образом:

поток   создает   или   открывает   семафор   с   помощью   функций CreateSemaphore() или OpenSemaphore() соответственно;

поток вызывает функцию WaitForSingleObjectQ (или WaitForMultipleObjects()) Для того, чтобы определить, свободен ли тре­бующийся потоку ресурс. В зависимости от результата, возвращаемого этой функцией, определяются дальнейшие действия;

при завершении поток вызывает функцию ReleaseSemaphoreQ, осво­бождающую семафор.

СОБЫТИЯ

События являются самой примитивной разновидностью объектов синхронизации. Они используются для того, чтобы оповестить поток о том, что наступило ожидаемое событие. Эти объекты обычно использу­ются для того, чтобы синхронизировать потоки, которые работают по принципу конвейера. К примеру, один поток опрашивает датчики и загружает считанные значения в буфер. Другой поток считывает эти данные из буфера и производит их обработку. Первый поток может сигнализировать второму о том, что событие - заполнение буфера -наступило. Второй поток может сигнализировать первому о том, что наступило другое событие - данные из буфера считаны, ожидается новая порция данных. Событие может иметь два состояния - занятое (nonsignaled) и свободное (signaled).




Начало  Назад  Вперед



Книжный магазин