Мой вопрос о порядке выполнения гарантий в С# (и предположительно .Net вообще). Я даю примеры Java, с которыми я знаю что-то, что можно сравнить.
Для Java (от "Java Concurrency на практике" )
Нет гарантии, что операции в одном потоке будут выполняться в порядке, заданном программой, до тех пор, пока переупорядочение не будет обнаружено внутри этого потока, даже если переупорядочение очевидно для других потоков.
Итак, код
y = 10;
x = 5;
a = b + 10;
может фактически назначить a = b + 10 Перед назначением y = 10
И на Java (из той же книги)
Все нитки A, выполняемые в или перед синхронизированным блоком, видны в потоке B, когда он запускает синхронизированный блок, защищенный одной и той же блокировкой.
поэтому в Java
y = 10;
synchronized(lockObject) {
x = 5;
}
a = b + 10;
y = 10 и x = 5 гарантированы, что оба выполняются до a = b + 10 (я не знаю, будет ли y = 10 гарантировано работать до x = 5).
Какие гарантии делает код С# для порядка выполнения для операторов С#
y = 10;
lock(lockObject) {
x = 5;
}
a = b + 10;
Мне особенно интересен ответ, который может дать окончательную ссылку или какое-либо другое действительно содержательное обоснование, поскольку такие испытания трудно проверить, потому что они касаются того, что разрешено компилятором, а не того, что он делает каждый раз, и потому что когда они потерпят неудачу, вам будет очень сложно воспроизвести прерывистые ошибки, когда потоки ударяют по вещам только в неправильном порядке.