Page 73 - 4989
P. 73
CRITICAL_SECTION cs;
...
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs);
doSomething();
LeaveCriticalSection(&cs);
Всі фрагменти коду, захищені однією критичною секцією,
гарантовано будуть виконуватись неодночасно. Функція
EnterCriticalSection призупиняє виконання потоку, якщо
виявляється, що уже виконується деякий код, захищений цією ж
критичною секцією. Функція LeaveCriticalSection повідомляє
менеджеру процесів операційної системи, що критичний
фрагмент завершився, і якщо якісь потоки очікують на цю
критичну секцію у функції EnterCriticalSection, то запускається
на виконання один з таких потоків.
По завершенні роботи з критичною секцією слід звільнити
використовувані нею ресурси функцією DeleteCriticalSection.
До об’єктів синхронізації, реалізованих у режимі ядра,
належать:
- мьютекси (Mutex);
- семафори (Semaphore);
- події (Event).
Робота з ними відбувається за допомогою дескрипторів типу
HANDLE, відповідно по завершенні роботи з ними слід
викликати CloseHandle. Схема роботи з цими об’єктами
передбачає, що деякий потік може очікувати на один або кілька
об’єктів синхронізації за допомогою функцій WaitForSingleObject
(очікування одного об’єкта) або WaitForMultipleObjects
(очікування багатьох об’єктів). Очікування відбувається, доки
об’єкт не буде переведений у сигнальний стан деяким іншим
потоком. Для мьютекса перевід у сигнальний стан здійснюється
функцією ReleaseMutex, для семафора - ReleaseSemaphore, для події
– SetEvent.
Мьютекс дуже схожий на критичну секцію, оскільки також
дозволяє захистити деякий фрагмент коду від одночасного
виконання кількома потоками. Захоплення мьютекса деяким
потоком здійснюється після успішного завершення функції
73