Шаг 80 - Что такое критическая секция (Critical Section)

Критическая секция (Critical Section) это участок кода, в котором поток (thread) получает доступ к ресурсу (например переменная), который доступен из других потоков.

80.gif (4833 b)

Объект критическая секция обеспечивает синхронизацию. Этим объектом может владеть только один поток, что и обеспечивает синхронизацию. Для работы с критическими секциями есть ряд функций API и тип данных CRITICAL_SECTION. Для использования критической секции нужно создать переменную данного типа, и проинициализировать ее перед использованием с помощью функции InitializeCriticalSection(). Для того, чтобы войти в секцию нужно вызвать функцию EnterCriticalSection(), а после завершения работы LeaveCriticalSection(). Что будет, если поток обратится к секции, в которой сейчас другой поток ? Тот поток, который обратится будет блокирован пока критическая секция не будет освобождена. Саму критическую секцию можно удалить функцией DeleteCriticalSection(). Для того, чтобы обойти блокировку потока при обращении к занятой секции есть функция TryEnterCriticalSection(), которая позволяет проверить критическую секцию на занятость.

Здесь есть один маленький и тонкий момент, который относится к синхронизации как таковой. Этот момент в том, что физически данные не защищены. Никто не помещает потоку обратиться к разделяемым данным. Синхронизация это подсказка как должен себя вести объект при доступе к данным. Хороший пример - это светофор. На красный нужно стоять. Но не факт, что все это выполняют :-)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.