Пожалуйста, может кто-нибудь кратко рассказать мне пример, что означает средство критической секции? простым языкомЧто такое критический раздел в потоке?
ответ
A critical section - это часть кода, которая должна выполняться без внешних помех - т. е. без другой нити, потенциально затрагивающей/находящуюся под воздействием «промежуточных» состояний внутри раздела.
Например, система резервирования может иметь критический раздел при резервировании того, что ему необходимо проверить, чтобы проверить, доступен ли этот элемент, и затем пометить его как более недоступную, без какой-либо другой попытки зарезервировать комнату этот статус посередине.
Таким образом, критическая часть фрагмента кода - это место, где разрешено только один поток выполнения, чтобы предотвратить такие вещи, как условия гонки.
Критический раздел обертывает часть вашего кода, в котором изменяются общие данные. Монитор гарантирует, что в него входит только один поток.
подпрограмма критического раздела - это подход к проблеме двух или более программ, конкурирующих за один и тот же ресурс одновременно. Представьте, что две программы хотят увеличить счетчик. Если оба делают это одновременно: извлеките операнд, увеличьте его и сохраните увеличенное значение, тогда один из приращений будет потерян. На современных процессорах программы могут использовать инструкцию Atom-read-modify-write, такую как fetch-and-op, compare-and-swap или exchange. На ранних процессорах эти инструкции не существовали; проблема заключалась в том, чтобы выполнить приращение атомарно, используя только обычные инструкции ассемблера. Проблема была определена и впервые решена Эдсгаром Дейкстре. «Критическая секция» - это его имя для кода, который решил проблему.
Критический раздел - это раздел кода, в котором, если несколько потоков должны были выполняться в одно и то же время, они могли бы мешать друг другу, чтобы вызвать неправильный результат или другую неисправность. Представьте себе простую процедуру в банке для обработки чека:
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 дополнительны счастливый и отправиться в круиз с свободными деньгами !!
http://tinyurl.com/yzg6u8s? – skaffman
Возможный Dupe: http://stackoverflow.com/questions/419145/python-threads-critical-section – Zaki