Сен 27

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

Критическая секция (critical section) — это небольшой участок кода, который должен использоваться только одним потоком одновременно. Если в одно время несколько потоков попытаются получить доступ к критическому участку, то контроль над ним будет предоставлен только одному из потоков, а все остальные будут переведены в состояние ожидания до тех пор, пока участок не освободится.
Для использования критической секции необходимо определить переменную типа CRITICAL_SECTION:
CRITICAL_SECTION cs;
Поскольку эта переменная должна находиться в области видимости для каждого использующего ее потока, обычно она объявляется как глобальная. Эту переменную следует инициализировать до ее первого применения с помощью функции InitializeCriticalSection:
InitializeCriticalSection(Scs);
Чтобы завладеть критическим участком, поток должен вызвать функцию EnterCriticalSection:
EnterCri ti calSecti on(&cs);
Если критический участок не используется в данный момент другим потоком, он обозначается системой как занятый, и поток немедленно продолжает выполнение. Если критический участок уже используется, то поток блокируется до тех пор, пока участок не будет освобожден.
После вызова EnterCriticalSection следуют инструкции, принадлежащие критическому участку.
Конец критического участка обозначается вызовом функции LeaveCriticalSection:
LeaveCriticalSection(&cs);
Как только поток получает контроль над критическим участком, доступ других потоков к этому участку блокируется. При этом очень важно, чтобы время выполнения критического участка было минимальным. Это позволит добиться наилучших результатов работы приложения.
Если критический участок больше не нужен, используемые им ресурсы освобождаются вызовом функции DeleteCriticalSection.