Составители:
Рубрика:
количество потоков, которые могут завладеть семафором. Обратите внимание,
что функция CreateSemaphore() позволяет при создании нового семафора при-
своить его счетчику значение меньше максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Та-
кой прием позволит заблокировать все потоки до тех пор, пока программа не
произведет инициализацию, а затем не увеличит значение счетчика с помощью
команды ReleaseSemaphore().
Не забывайте вовремя освобождать синхронизирующие объекты. Не задав
максимального времени ожидания и забыв освободить исключающий семафор,
вы заблокируете все ожидающие его потоки.
Поток может ожидать несколько сигналов от одного и того же объекта, не бу-
дучи заблокированным, однако после завершения каждого из процессов ожидания
необходимо выполнять операцию освобождения. Это требование справедливо для
семафоров, исключающих семафоров и критических разделов.
2.4.3. Объект - событие
Событие представляет собой объект, который создается программой при
необходимости информировать потоки о выполнении определенных действий.
В простейшем случае (ручной сброс) событие переключает свое состояние
с помощью команд SetEvent() – сигнал включен и ResetEvent() – сигнал вы-
ключен. Когда сигнал включается, его получают все потоки, которые ожидают
появления соответствующего события. Если сигнал выключается, все такие
потоки блокируются. В отличие от семафоров и исключающих семафоров со-
бытия данного типа изменяют свое состояние только при подаче соответст-
вующей команды каким-нибудь потоком.
События целесообразно использовать при условии, что поток должен вы-
полняться только после того, как программа обновит свое окно или пользова-
тель введет определенную информацию [2]. Ниже представлены основные
функции, предназначенные для работы с событиями:
HANDLE CreateEvent
(LPSECURITY_ATTRIBUTES lpsa, // привилегии доступа
// (по умолчанию = NULL)
BOOL bManualReset, // TRUE – событие должно быть сброшено вручную
BOOL bInitialState, // TRUE – создание события в сигнальном состоянии
LPTSTR lpszEventName, //имя события (допускается значение NULL));
BOOL SetEvent (HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);…
При установке параметра bInitialState функция CreateEvent() создает со-
бытие, которое сразу же будет находиться в сигнальном состоянии. Функции
SetEvent() и ResetEvent() в случае успешного завершения возвращают значение
TRUE,
при возникновении ошибки – значение FALSE.
32
количество потоков, которые могут завладеть семафором. Обратите внимание,
что функция CreateSemaphore() позволяет при создании нового семафора при-
своить его счетчику значение меньше максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Та-
кой прием позволит заблокировать все потоки до тех пор, пока программа не
произведет инициализацию, а затем не увеличит значение счетчика с помощью
команды ReleaseSemaphore().
Не забывайте вовремя освобождать синхронизирующие объекты. Не задав
максимального времени ожидания и забыв освободить исключающий семафор,
вы заблокируете все ожидающие его потоки.
Поток может ожидать несколько сигналов от одного и того же объекта, не бу-
дучи заблокированным, однако после завершения каждого из процессов ожидания
необходимо выполнять операцию освобождения. Это требование справедливо для
семафоров, исключающих семафоров и критических разделов.
2.4.3. Объект - событие
Событие представляет собой объект, который создается программой при
необходимости информировать потоки о выполнении определенных действий.
В простейшем случае (ручной сброс) событие переключает свое состояние
с помощью команд SetEvent() – сигнал включен и ResetEvent() – сигнал вы-
ключен. Когда сигнал включается, его получают все потоки, которые ожидают
появления соответствующего события. Если сигнал выключается, все такие
потоки блокируются. В отличие от семафоров и исключающих семафоров со-
бытия данного типа изменяют свое состояние только при подаче соответст-
вующей команды каким-нибудь потоком.
События целесообразно использовать при условии, что поток должен вы-
полняться только после того, как программа обновит свое окно или пользова-
тель введет определенную информацию [2]. Ниже представлены основные
функции, предназначенные для работы с событиями:
HANDLE CreateEvent
(LPSECURITY_ATTRIBUTES lpsa, // привилегии доступа
// (по умолчанию = NULL)
BOOL bManualReset, // TRUE – событие должно быть сброшено вручную
BOOL bInitialState, // TRUE – создание события в сигнальном состоянии
LPTSTR lpszEventName, //имя события (допускается значение NULL));
BOOL SetEvent (HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);…
При установке параметра bInitialState функция CreateEvent() создает со-
бытие, которое сразу же будет находиться в сигнальном состоянии. Функции
SetEvent() и ResetEvent() в случае успешного завершения возвращают значение
TRUE, при возникновении ошибки – значение FALSE.
32
Страницы
- « первая
- ‹ предыдущая
- …
- 30
- 31
- 32
- 33
- 34
- …
- следующая ›
- последняя »
