критичен участък
Критичен раздел— раздел от изпълнимия код на програмата, който има достъп до споделен ресурс (данни или устройство), който не трябва да се използва едновременно от повече от една нишка за изпълнение. Когато две (или повече) нишки са в критичната секция, възниква състояние на „състезание“ („състезание“). За да избегнете тази ситуация, трябва да бъдат изпълнени четири условия:
- Две нишки не трябва да са в критични региони едновременно.
- Програмата не трябва да прави предположения за скорост или брой процесори.
- Нишка извън критичната област не може да блокира други нишки.
- Невъзможно е нишка да чака вечно, за да удари критичен регион.
Критична секция(англ. Critical section ) е обект за синхронизиране на нишки, който ви позволява да предотвратите едновременното изпълнение на определен набор от операции (обикновено свързани с достъп до данни) от няколко нишки. Критичната секция изпълнява същите задачи като mutex.
Има терминологични разлики между мутекс и критична секция, така че процедура, подобна на заснемането на мутекс, се нарича влизане в критичната секция (англ. enter), отключването на мутекса се нарича излизане от критичната секция (англ. leave).
Процедурата за влизане и излизане от критични секции обикновено отнема по-малко време от подобни операции с mutex, което се дължи на липсата на необходимост от достъп до ядрото на ОС.
В операционните системи от фамилията Microsoft Windows разликата между mutex и критична секция е, че mutex е обект на ядрото и може да се използва от няколко процеса едновременно, докато критичната секция принадлежи на процеса и служи за синхронизиране само на неговите нишки.
Критичните раздели на Windows имат оптимизация за използване на атомарно променлива променлива заедно с обекта на ядрото „събитие за синхронизиране“. Улавянето на критична секция означава атомарно увеличение на променливата с 1. Превключването към изчакване на събитие на ядрото се извършва само ако стойността на променливата преди улавянето вече е била по-голяма от 0, тоест има истинска „конкуренция“ на две или повече нишки за ресурс.
По този начин, при липса на конкуренция, прихващането/освобождаването на критична секция се заобикаля без извиквания към ядрото.
В допълнение, прихващането на вече заета критична секция преди достъп до ядрото изчаква за кратко време в цикъла (броят на повторенията на цикъла (англ. spin count) се задава от функциите InitializeCriticalSectionAndSpinCount() или SetCriticalSectionSpinCount()), анкетиращи променливата за броя на текущите потребители и ако тази променлива стане равна на 0, тогава прихващането се извършва без извиквания към ядро.
Подобен обект в ядрото на Windows се нарича FAST_MUTEX (ExAcquire/ReleaseFastMutex). Различава се от критичната секция по това, че не поддържа рекурсивно повторно придобиване от същата нишка.
Подобен обект в Linux се нарича futex.