2010-03-20 3 views

ответ

4

A critical section - это часть кода, которая должна выполняться без внешних помех - т. е. без другой нити, потенциально затрагивающей/находящуюся под воздействием «промежуточных» состояний внутри раздела.

Например, система резервирования может иметь критический раздел при резервировании того, что ему необходимо проверить, чтобы проверить, доступен ли этот элемент, и затем пометить его как более недоступную, без какой-либо другой попытки зарезервировать комнату этот статус посередине.

Таким образом, критическая часть фрагмента кода - это место, где разрешено только один поток выполнения, чтобы предотвратить такие вещи, как условия гонки.

0

Критический раздел обертывает часть вашего кода, в котором изменяются общие данные. Монитор гарантирует, что в него входит только один поток.

0

подпрограмма критического раздела - это подход к проблеме двух или более программ, конкурирующих за один и тот же ресурс одновременно. Представьте, что две программы хотят увеличить счетчик. Если оба делают это одновременно: извлеките операнд, увеличьте его и сохраните увеличенное значение, тогда один из приращений будет потерян. На современных процессорах программы могут использовать инструкцию Atom-read-modify-write, такую ​​как fetch-and-op, compare-and-swap или exchange. На ранних процессорах эти инструкции не существовали; проблема заключалась в том, чтобы выполнить приращение атомарно, используя только обычные инструкции ассемблера. Проблема была определена и впервые решена Эдсгаром Дейкстре. «Критическая секция» - это его имя для кода, который решил проблему.

1

Критический раздел - это раздел кода, в котором, если несколько потоков должны были выполняться в одно и то же время, они могли бы мешать друг другу, чтобы вызвать неправильный результат или другую неисправность. Представьте себе простую процедуру в банке для обработки чека:

doCheck (writer, recipient, amount) { 
    if (amount < 0) return DIAF; 
    balance = getBalance(writer); 
    if (balance < amount) return NSF; 
    setBalance(recipient, getBalance(recipient) + amount); 
    setBalance(writer, balance - amount); 
} 

Теперь представьте, что мой баланс составляет $ 11 000, и я написал две проверки:

John, ColumbiaHouse, $0.01 
John, MrsJohn, $10,000 

Теперь наши банковские процессы стольких проверок, что «туз» программист DonaldJavaSlump добавляет нарезание резьбы, поскольку производительность - но он не знает о критических участках, поэтому нить 1 начинает обработку первой проверки:

if (amount < 0) return DIAF;    // (0.01 < 0)? OK 
balance = getBalance(John)    // $11,000 
if (balance < amount) return NSF;  // (11,000 < 0.01?) OK 
setBalance(ColumbiaHouse, ...   // KaChing! ColumbiaHouse gets paid 

и теперь нить 2 начинается через тот же участок кода обработки второй проверки:

if (amount < 0) return DIAF;    // (10,000 < 0)? OK 
balance = getBalance(John);   // $11,000 (still!) 
if (balance < amount) return NSF;  // (11,000 < 10,000?) OK 
setBalance(MrsJohn, ...     // KaChing! MrsJohn gets paid 
setBalance(John, balance - amount); // my balance is now $1,000 :(

, а затем поток 1 получает около к завершению своей работы:

setBalance(John, balance - amount); // now balance is $10,999.99!!! :) 

Теперь Джон и MrsJohn дополнительны счастливый и отправиться в круиз с свободными деньгами !!