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