Что такое критическая секция?

Просто хочу немного прояснить это. Представьте, что я использую API Windows для EnterCriticalSection. Я называю их всех EnterCriticalSection(&criticalsection);

Это многопоточная функция потока.

void thread (){

//enter critical section  (part 1)
data
//leave critical section
///more data 1
//entercritical section  (part 2)
//more data 2
//leave critical section 

}

Как только поток входит в критический (часть 1), другие потоки не могут войти в этот раздел независимо от того, есть ли у других данных 1 общие данные или нет? Также в это время другие потоки также не могут войти во вторую часть критического раздела.


person Jake    schedule 09.04.2011    source источник
comment
Ганс - неправда. Джейк спросил, заблокирует ли процесс, находящийся в CriticalSection1, и CS1, и CS2. Это неверно - критические секции независимы. Джейк, если вы хотите, чтобы CS1 блокировал оба, вы должны вложить CS2 в CS1.   -  person Greg    schedule 17.08.2012


Ответы (3)


Критический раздел - это фрагмент кода. Если какой-либо поток вошел в него, никакой другой поток не сможет войти, пока он не освободится. Если 1 и 2 являются разными критическими секциями (т.е. обрабатываются другим семафором), кто-то может ввести 2, если 1 занята.

person iehrlich    schedule 09.04.2011

Правило простое: только один поток может выполнять код внутри определенного критического раздела (любая часть кода, выполняемая между вызовами EnterCriticalSection и LeaveCriticalSection в одном и том же экземпляре). С точки зрения операционной системы такие вещи, как части кода, функции здесь не имеют значения. Единственное, что имеет значение, - это количество обращений к упомянутым подпрограммам. Всякий раз, когда происходит ситуация, когда какой-то поток вызывает EnterCriticalSection больше, чем LeaveCriticalSection для конкретного объекта критической секции, это называется «внутри этой критической секции».

При этом вы можете создать несколько критических разделов, и они будут применяться независимо. Таким образом, одна критическая секция никогда не влияет на другую критическую секцию. Различные критические секции создаются с помощью отдельных вызовов конструктора.

person julx    schedule 09.04.2011

Видеть это:

Рассмотрим переменную

int k

два потока работают на k с этим оператором

k+=100;

Теперь предположим, что k равно 0. Первый поток начинает читать k, находит k = 0, затем прибавляет k на 100. Затем второй поток начинает читать k до того, как 1-й поток записывает k = 100 обратно. Затем второй поток примет k = 0 и прибавит к нему 100 и, наконец, после соединения двух потоков k = 100 не ожидается 200. Это причина, по которой мы устанавливаем k+=100 критический раздел.

person xis    schedule 09.04.2011