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

Какова цель ключевого слова volatile в С#

Какова цель ключевого слова volatile в С#?

Где мне нужно использовать это ключевое слово?

Я видел следующее утверждение, но я не могу понять, почему здесь требуется volatile?

internal volatile string UserName; 
4b9b3361

Ответ 1

Я отсылаю вас к разделу 10.5.3 спецификации, в котором говорится:

Для энергонезависимых полей оптимизация методы, которые изменяют порядок инструкций может привести к неожиданным и непредсказуемые результаты в многопоточные программы, которые поля без синхронизации, такие как которые предоставляются с помощью оператора блокировки (§8.12). Эти оптимизации могут быть выполняемый компилятором, система времени выполнения или аппаратное обеспечение. Для изменчивые поля, такое переупорядочение оптимизация ограничена:

а чтение изменчивого поля называется неустойчивое чтение. Неустойчивое чтение "приобретать семантику"; то есть гарантированно произойдет до ссылки на память, которые происходят после это в последовательности команд.

а запись изменчивого поля называется volatile write. Неустойчивая запись "семантика выпуска"; то есть гарантированно произойдет после любой памяти ссылки до написания инструкция в инструкции последовательность.

Эти ограничения обеспечивают что все потоки будут наблюдать изменчивые записи, выполняемые любым другим потоком в том порядке, в котором они были выполнено. Соответствующая реализация не требуется предоставлять единый общий порядок волатильности записывается как видно из всех потоков выполнения.

Прочитайте это очень тщательно, если у вас есть намерение когда-либо делать поле volatile. Если вы не полностью и полностью не понимаете все последствия изменчивой семантики, тогда не пытайтесь их использовать. Обычно гораздо лучше использовать блокировку, которая автоматически дает вам достаточные барьеры памяти для обеспечения необходимой семантики получения и выпуска. Помните, что замки действительно дороги, когда они борются.

Ответ 2

Volatile используется для переменной, которая может изменяться без вашего действия во время работы вашего кода. Он сообщает компилятору написать сборку таким образом, чтобы никогда не кэшировать эту переменную, но вместо этого обязательно прочитайте ее перед каждым использованием.

Примером того, что будет volatile, будет аппаратный регистр, который ваш код имеет карту памяти и читает, чтобы определить, когда установлен флаг. Аппаратное обеспечение может установить значение, пока ваш код запущен, и без использования ключевого слова volatile вы не заметите это изменение, поскольку сборка никогда не проверит значение.

Ответ 3

Volatile - это подсказка для компилятора (и компилятора ngen/jit), что значение этой переменной может измениться в любой момент, и, таким образом, оптимизация вокруг доступа к переменной путем кэширования значения локально volatile будет отключена.

Рассмотрим следующий код:

If (UserName == "")
    // do something
If (UserName == "Fred")
    // do something

Если volatile не присутствовал, компилятор может генерировать IL, где он сохраняет ссылку в стеке для первого сравнения и повторяет его для второго. Однако добавление volatile сообщает компилятору, что ссылка может быть изменена другим потоком, заставляя его генерировать IL, который не будет повторно использовать копию стека из первого сравнения.

Ответ 4

MSDN будет суммировать лучше, чем я....

"Ключевое слово volatile указывает, что поле может быть изменено несколькими потоками, которые выполняются в одно и то же время. Поля, объявленные volatile, не подпадают под оптимизацию компилятора, которые предполагают доступ одним потоком. -точное значение всегда присутствует в поле."

http://msdn.microsoft.com/en-us/library/x13ttww7(v=VS.100).aspx

Ответ 5

Это означает, что значение может быть изменено другим потоком, поэтому значение нужно читать, даже если предыдущая инструкция уже прочитала его.

http://msdn.microsoft.com/en-us/library/x13ttww7%28VS.71%29.aspx

Ответ 6

Это не что иное, как сообщить компилятору, что эта переменная изменит свою ценность в любое время с помощью чего угодно и компилятор не должен делать никаких предположений об этой переменной.

Обычно компилятор предполагает, что какая-то переменная будет постоянный во время выполнения. Это может привести к ошибке при проверке registor несколько раз. Поскольку значение регистра может меняться чем угодно. Итак, для этих переменных должен быть объявлен "изменчивым" и проверяться каждый раз появляется в коде без каких-либо предположений.