Page 74 - 4989
P. 74
очікування, а звільнення – функцією ReleaseMutex.
Приклад використання мьютекса:
hMutex = CreateMutex(NULL, FALSE, NULL);
...
WaitForSingleObject(hMutex, INFINITE);
doSomething();
ReleaseMutex(hMutex);
Відмінності мьютекса від критичної секції є наступними:
- мьютексу при створенні можна присвоїти ім’я, яке
реєструється в глобальному просторі імен операційної
системи і може бути використане іншим процесом (в той
час як критична секція може використовуватись тільки тим
процесом, у якому вона визначена);
- для мьютекса можна задати таймаут у функції очікування
WaitForSingleObject/WaitForMultipleObjects (для критичної
секції це неможливо, тому вона може блокувати деякий
потік назавжди);
- якщо потік завершився, не викликавши функцію звільнення
мьютекса ReleaseMutex, мьютекс переводиться в
сигнальний стан (для критичної секції, якщо не викликати
LeaveCriticalSection, то решта потоків ніколи не
отримають доступ до захищеного нею коду).
Якщо жодна із цих переваг не потрібна чи не важлива, краще
використовувати критичні секції, оскільки вони мають дещо
більшу швидкодію.
Семафор дещо схожий на мьютекс, однак підтримує
лічильник. Максимальне значення лічильника слід задати у
функції створення семафора. Семафор перебуває у сигнальному
стані, якщо його лічильник більший за нуль. Як і для мьютекса,
захоплення семафора здійснюється після успішного завершення
функції очікування WaitForSingleObject/WaitForMultipleObjects,
при цьому лічильник семафора зменшується на одиницю. При
кожному виклику функції ReleaseSemaphore лічильник
збільшується на значення, вказане одним з її аргументів. Таким
чином, якщо встановити максимальне значення лічильника в 1, то
74