изменчивый с семантикой выпуска / приобретения - PullRequest
6 голосов
/ 29 июня 2011

Начиная с Java 5, ключевое слово volatile имеет семантику освобождения / приобретения, чтобы побочные эффекты были видны другим потокам (включая присвоения энергонезависимых переменных!).Возьмите эти две переменные, например:

int i;
volatile int v;

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

i = 42;
v = 0;

В какой-то более поздний момент времени поток 2 выполняет следующие операторы:

int some_local_variable = v;
print(i);

В соответствии с моделью памяти Java записьv в потоке 1, за которым следует чтение v в потоке 2, гарантирует, что поток 2 видит запись в i, выполненную в потоке 1, поэтому выводится значение 42.

Мой вопрос:volatile имеет ту же семантику выпуска / приобретения в C #?

Ответы [ 2 ]

15 голосов
/ 30 июня 2011

Семантика «volatile» в C # определена в разделах 3.10 и 10.4.3 спецификации.Вместо того, чтобы воспроизводить их здесь, я рекомендую вам посмотреть его в спецификации, а затем решить, что слишком сложно и опасно использовать «volatile», и вернуться к использованию блокировок.Это то, что я всегда делаю.

См. 3.10 Порядок выполнения и 10.4.3 Volatile Fields Спецификация.

6 голосов
/ 30 июня 2011

Ну, я думаю, это гарантирует, что , если some_local_variable читается как 0 (из-за записи в v), i будет читаться как 42.

Хитрая часть "в какой-то более поздний момент времени".Хотя о нестабильности обычно говорят в терминах «сбрасывающих» записей, на самом деле это не так, как это определено в спецификации (Java или C #).

Из спецификации языка C # 4, раздел 10.5.3:

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

  • Чтение энергозависимого поля называется энергозависимым чтением.Изменчивое чтение имеет «приобретенную семантику»;то есть гарантированно произойдет до любых ссылок на память, которые появляются после нее в последовательности команд.
  • Запись изменчивого поля называется изменчивой записью.Изменчивая запись имеет «семантику релиза»;то есть это гарантированно произойдет после любых ссылок на память перед инструкцией записи в последовательности команд.

Затем есть пример, который вполне похож на ваш, но в зависимости от значения, считываемого из переменной volatile.

И, как и Эрик, я бы сильно избегал полагаться на volatile.Трудно рассуждать, и лучше всего оставить это Джо Даффи / Стивену Таубсу со всего мира.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...