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