Понятие критической секции позволяет уберечь определенные области программы так,
чтобы в этой области программы в данный момент времени исполнялся бы только
один поток. Рассмотрим функции для работы с критической секцией.
InitializeCriticalSection – данная функция создаёт объект под название
критическая секция.
Параметры функции: первый параметр – указатель на структуру, указанную ниже.
Поля данной структуры используются только внутренними процедурами, и смысл их
безразличен.
EnterCriticalSection – войти в критическую секцию. После выполнения этой
функции данный поток становится владельцем данной секции. Следующий поток,
вызвав данную функцию, будет находиться в состоянии ожидания. Параметр функции
такой же, что и в предыдущей функции.
LeaveCriticalSection – покинуть критическую секцию. После этого второй поток,
который был остановлен функцией EnterCriticalSection, станет владельцем
критической секции. Параметр функции LeaveCriticalSection такой же, как и у
предыдущих функций.
DeleteCriticalSection – удалить объект «критическая секция». Параметр
аналогичен предыдущим.
Программно можно определить несколько объектов критической секции, с которыми
будут работать несколько потоков. Мы не зря, говоря о критических секциях,
упоминаем только потоки. Разные процессы не могут использовать данный объект
синхронизации.
Я приведу пример из MSDN использования этих функций:
// Global variable
CRITICAL_SECTION CriticalSection;
void main()
{
...
// Initialize the critical section one time only.
InitializeCriticalSection(&CriticalSection);
...
// Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection)
}
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
// Request ownership of the critical section.__try
{
EnterCriticalSection(&CriticalSection);
// Access the shared resource.
}
__finally
{
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
}
...
}
Заключая разговор о критических секциях, отметим, что это наиболее быстрый
способ синхронизации. К минусам данного подхода относится невозможность доступа
к секции сразу нескольких потоков, а также отсутствие специальных средств,
чтобы подсчитать число обращений к ресурсу.