Что такое критический раздел в потоке? - PullRequest
5 голосов
/ 20 марта 2010

Пожалуйста, кто-нибудь может вкратце рассказать мне на примере, что означает средство критической секции? простым языком

Ответы [ 4 ]

4 голосов
/ 20 марта 2010

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

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

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

1 голос
/ 06 февраля 2016

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

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!!! :)

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

0 голосов
/ 06 февраля 2016

подпрограмма критического раздела - это подход к проблеме двух или более программ, конкурирующих за один и тот же ресурс одновременно. Представьте, что две программы хотят увеличить счетчик. Если оба делают это одновременно: извлекают операнд, увеличивают его и сохраняют увеличенное значение, то одно из приращений будет потеряно. На современных процессорах программы могут использовать атомарную инструкцию чтения-изменения-записи, такую ​​как выборка-и-операция, сравнение-и-замена или обмен. На ранних процессорах эти инструкции не существовали; проблема заключалась в том, чтобы выполнить приращение атомарно, используя только обычные инструкции ассемблера. Проблема была определена и впервые решена Эдсгаром Дейкстра. «Подпрограмма критического раздела» была его именем для кода, который решил проблему.

0 голосов
/ 20 марта 2010

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

...