В чем разница волатильности в С# и c? Меня спросили об этом в одном интервью.
Разница в летучих в С# и C
Ответ 1
Статья, упомянутая в этом сообщении в блоге Herb Sutter, объясняет вещи кратко и четко и сравнивает использование и значение volatile в C, С++, Java и С#.
На этом же сайте есть несколько хороших вопросов и ответов:
- Как проиллюстрировать использование ключевого слова volatile в С#
- Использование волатильного спецификатора в C/С++/Java
- Что такое ключевое слово "volatile" , которое используется для?
- переменные переменные многопоточности С++
- volatile и многопоточность?
- Почему волатильность необходима в c?
РЕДАКТИРОВАТЬ: не путать кого-либо здесь, это " точная ссылка" в статью DDJ, упомянутую в исходной ссылке (которая является ссылкой к блогу Herb Sutter).
Также эта статья Нигеля Джонса объясняет ключевое слово volatile в контексте встроенного программирования C. Поскольку этот вопрос, похоже, появился в интервью эта другая статья того же автора является одним из моих фаворитов ( " точная ссылка") и имеет еще одно хорошее объяснение неустойчивости в мире C.
Ответ 2
В C volatile говорится, что компилятор не должен оптимизировать доступ к переменной:
int running = 1;
void run() {
while (running) {
// Do something, but 'running' is not used at all within the loop.
}
}
Обычно компилятор может перевести "while (running)" в этом случае только "while (1)". Когда переменная "running" отмечена как volatile, компилятор вынужден каждый раз проверять переменную.
Важно понимать, что для C 'volatile' ограничивает оптимизацию компилятора, в то время как ваше оборудование (т.е. кэширование процессора, конвейер команд и т.д.) может по-прежнему изменять порядок доступа к памяти. Невозможно, чтобы ваш компилятор C сообщил, что ваше оборудование не оптимизируется. Вы должны сделать это самостоятельно (например, используя барьер памяти).
Насколько я знаю (но я не совсем уверен), спецификация С# принимает это немного дальше:
- Если вы пишете переменную volatile, гарантируется, что все обращения к памяти будут выполняться до ее завершения.
- Если вы читаете переменную volatile, гарантируется, что все обращения к памяти, которые вы выполняете после того, как она не будет завершена до того, как будет выполнена проверка изменчивой переменной, будет завершена.