Подтвердить что ты не робот

Разница в летучих в С# и C

В чем разница волатильности в С# и c? Меня спросили об этом в одном интервью.

4b9b3361

Ответ 1

Статья, упомянутая в этом сообщении в блоге Herb Sutter, объясняет вещи кратко и четко и сравнивает использование и значение volatile в C, С++, Java и С#.

На этом же сайте есть несколько хороших вопросов и ответов:

РЕДАКТИРОВАТЬ: не путать кого-либо здесь, это " точная ссылка" в статью 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, гарантируется, что все обращения к памяти, которые вы выполняете после того, как она не будет завершена до того, как будет выполнена проверка изменчивой переменной, будет завершена.