Ответ 1
ISO 23270: 2006 — Информационные технологии и языки программирования: С#, & sect; 10.10 говорит (и цитирую):
10.10 Порядок выполненияВыполнение должно выполняться таким образом, чтобы побочные эффекты каждого исполняемого потока сохраняются в критических точках выполнения. Определен побочный эффект как чтение или запись изменчивого поля, запись в энергонезависимую переменную, запись на внешний ресурс и выброс исключения. Критические точки выполнения, при которых порядок этих побочных эффектов должны сохраняться ссылки на изменчивые поля (§17.4.3),
lock
(§15.12), а также создание и завершение потоков. Реализация может свободно изменять порядок выполнения программы С#, с учетом следующих ограничений:
Зависимость данных сохраняется в потоке выполнения. То есть значение каждой переменной вычисляется так, как если бы все утверждения в потоке выполнялись в исходном программном порядке. (акцент мой).
Правила упорядочения инициализации сохраняются (§17.4.4, §17.4.5).
Упорядочение побочных эффектов сохраняется в отношении изменчивых чтений и пишет (§17.4.3). Кроме того, реализация не должна оценивать часть выражение, если оно может вывести, что значение выражений не используется и что нет производятся необходимые побочные эффекты (в том числе любые вызванные вызовом метода или доступ к нестабильному полю). Когда выполнение программы прерывается асинхронным (например, исключение, созданное другим потоком), не гарантируется, что наблюдаемые побочные эффекты видны в исходном программном порядке.
Другие стандарты CLI также доступны бесплатно от ISO на
- ISO 23271: 2006 — * Информационные технологии и разделение разделов I-VI по языковой инфраструктуре (CLI)
- ISO 23272: 2006 — Информационные технологии и инфраструктура Common Language Infrastructure (CLI) Технический отчет по информации, полученной из XML файла раздела IV
Но если вас беспокоит многопоточность, вам нужно углубиться в стандарты и понять правила атомарности. Не каждая операция гарантирована быть атомной. Если вы используете многопоточные и вызывающие методы, которые ссылаются на любые, кроме локальных переменных (например, экземпляры или члены класса (статические)) без сериализации доступа через lock
, мьютекс, семафор или какой-либо другой метод сериализации, вы оставляете себя открытые для условий гонки.