Page 75 - 4989
P. 75
семафор буде еквівалентний мьютексу. Як правило, семафор
застосовують в тих випадках, коли необхідно забезпечити до
деякого ресурсу доступ обмеженої кількості потоків (але більше,
ніж одного), або для представлення кількості доступних ресурсів.
Наприклад, семафор може забезпечувати доступ до черги
повідомлень, які обробляються кількома потоками і в яку
додаються елементи ще кількома потоками. Коли потік ставить
задачі в чергу, він збільшує семафор на кількість задач, а коли
потік починає обробляти задачу, він зменшує семафор на 1.
Максимальне значення лічильника буде в цьому випадку
визначати максимальний розмір черги.
Подія (Event) дозволяє деякому потоку повідомити інший
потік про настання деякої події, викликавши функцію SetEvent.
Потік, що очікує на подію, як правило, виконує якісь дії по її
обробці. Наприклад, потік, що виконує довгі обчислення, може
час від часу повідомляти потік, який забезпечує інтерфейс
користувача, про обробку наступної порції даних, щоб ця
інформація була оперативно доведена до користувача.
Створення події виконується функцією
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
Перший і останній параметри можуть бути рівними NULL.
Аргумент bInitialState визначає початковий стан події –
сигнальний (TRUE) чи несигнальний (FALSE). Аргумент
bManualReset («ручне скидання») визначає, чи слід буде явно
скинути подію в несигнальний стан функцією ResetEvent (TRUE),
чи подія автоматично перейде в несигнальний стан, коли
очікуючий потік успішно завершить її очікування (FALSE). В
останньому випадку, якщо на подію очікують декілька потоків,
то коли спрацює функція очікування першого ж потоку, подія
буде скинута, і решта потоків не отримають шансу її обробити.
Якщо така поведінка неприйнятна (наприклад, треба щоб всі
потоки відновили роботу при настанні події), слід застосовувати
75