Ну, я, конечно, согласен, довольно ужасно, что такая деталь реализации раскрыта. Однако это та же самая деталь, которая раскрывается ключевым словом lock . Мы все еще очень далеки от того, чтобы этот генератор ошибок был полностью удален из нашего кода.
У ребят из железа много работы. Ключевое слово volatile имеет большое значение для ядер ЦП со слабой моделью памяти. Рынок не был добр к ним, Альфа и Итаниум не преуспели. Не совсем понятно почему, но я подозреваю, что сложность написания однопоточного кода для этих ядер во многом связана с этим. Неправильное восприятие - это настоящий кошмар для отладки. К этим процессорам относится словоблудие в документации библиотеки MSDN для volatile, в противном случае оно совершенно не подходит для ядер x86 / x64 и говорит о том, что ключевое слово делает гораздо больше, чем на самом деле. Volatile просто предотвращает сохранение значений переменных в регистрах ЦП этих ядер.
К сожалению, volatile все еще имеет значение для ядер x86 в очень избранных обстоятельствах. Я еще не нашел никаких доказательств того, что это имеет значение для ядер x64. Насколько я могу судить, и подкрепленная исходным кодом в SSCLI20, инструкция Opcodes.Volatile не предназначена для джиттера x64, не изменяя ни состояние компилятора, ни генерацию машинного кода. Это правильный путь.
Общий совет заключается в том, что, где бы вы ни размышляли о энергозависимости, первым делом следует использовать блокировку или один из классов синхронизации. Избегать их в попытке оптимизировать ваш код - это микрооптимизация, потерянная из-за количества сна, которое вы теряете, когда в вашей программе возникают проблемы с потоком.