Что такое критический раздел в потоке?

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

4 голоса | спросил Red Swan 20 MarpmSat, 20 Mar 2010 15:18:41 +03002010-03-20T15:18:41+03:0003 2010, 15:18:41

4 ответа


0

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

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

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

ответил Amber 20 MarpmSat, 20 Mar 2010 15:21:11 +03002010-03-20T15:21:11+03:0003 2010, 15:21:11
0

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

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

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

ответил John Hascall 6 FebruaryEurope/MoscowbSat, 06 Feb 2016 20:08:52 +0300000000pmSat, 06 Feb 2016 20:08:52 +030016 2016, 20:08:52
0

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

ответил duffymo 20 MarpmSat, 20 Mar 2010 15:22:24 +03002010-03-20T15:22:24+03:0003 2010, 15:22:24
0

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

ответил 6 FebruaryEurope/MoscowbSat, 06 Feb 2016 19:38:31 +0300000000pmSat, 06 Feb 2016 19:38:31 +030016 2016, 19:38:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132