Вопрос вроде моего был спросил, но мой немного отличается. Возникает вопрос: "Почему ключевое слово volatile не разрешено в C#
для типов System.Double
и System.Int64
и т.д.?"
При первом румянце я ответил своему коллеге: "Ну, на 32-битной машине эти типы берут по крайней мере два тика, чтобы даже войти в процессор, а .Net framework имеет намерение абстрагироваться от деталей, специфичных для процессора как это." На что он отвечает: "Это не абстрагирование чего-либо, если оно мешает вам использовать функцию из-за специфики процессора!"
Он подразумевает, что детали, зависящие от процессора, не должны отображаться для человека, использующего фреймворк, который "абстрагирует" детали, подобные этому от программиста. Таким образом, структура (или С#) должна абстрагироваться от них и делать то, что она должна делать, чтобы предлагать те же гарантии для System.Double
и т.д. (Будь то Семафор, барьер памяти или что-то еще). Я утверждал, что структура не должна добавлять накладные расходы на Семафор на volatile
, потому что программист не ожидает таких накладных расходов с таким ключевым словом, потому что Семафор не нужен для 32-битных типов. Большие накладные расходы для 64-разрядных типов могут стать неожиданностью, поэтому лучше, чтобы инфраструктура .Net просто не позволяла это делать, и заставлять вас делать свой собственный Семафор на больших типах, если накладные расходы приемлемы.
Это привело к тому, что мы выяснили, что такое волатильное ключевое слово. (см. эта страница). Эта страница заявляет в примечаниях:
В С# использование изменчивого модификатора в поле гарантирует, что все доступ к этому полю использует VolatileRead или VolatileWrite.
Hmmm..... VolatileRead
и VolatileWrite
обе поддерживают наши 64-битные типы!! Таким образом, мой вопрос:
"Почему ключевое слово volatile не разрешено в
C#
для типовSystem.Double
иSystem.Int64
и т.д.?"