Критические секции.

Критические секции используются для синхронизации потоков одного процесса. Создаются критические секции обычно в области глобальных переменных, доступные всем потокам процесса. При создании, критическая секция представляет структуру данных:

Critical_Section cs1;

Обычно состоит из следующих полей: счётчика блокировок, счётчика рекурсий, идентификатора потока, который владет критической секцией в данный момент времени.

С этими полями обычно работает ОС, пользователю там нечего делать. Для работы критической секции необходимо выполнить инициализацию:

InitializeCriticalSection(&cs1);

Delete CriticalSection(&cs1) – удаление критической секции.

 

EnterCriticalSection(&cs1) – вход в критическую секцию.

// обработка данных

LeaveCriticalSection(&cs1) – выход из критической секции.

Если поток вошёл в критическую секцию, но ещё не вышел из неё, то при попытке других потоков войти в ту же критическую секцию они будут переведены в состояние ожидания и будут ожидать до тех пор, пока поток, вошедший в критическую секцию, не выйдет из неё. Таким образом гарантируется, что фрагмент кода будет выполняться потоками последовательно.