Переменное присвоение и чтение атомарной операции?

Я не мог найти любую ссылку на это в документации...

Присвоение является к двойному (или какой-либо другой простой тип, включая булевскую переменную) атомарной операцией, просматриваемой с точки зрения потоков?

double value = 0;

public void First() {
 while(true) {
  value = (new Random()).NextDouble();
 }
}

public void Second() {
 while(true) {
  Console.WriteLine(value);
 }
}

В этом примере кода первый метод называют в одном потоке и втором в другом. Второй метод может получить испорченное значение, если это получает свое выполнение во время присвоения на переменную в другом потоке?

Я не забочусь, получаю ли я старое значение, только важно получить допустимое значение (не тот, где 2 из 8 байтов установлены). Я знаю, что это - глупый вопрос, но я хочу быть уверенным, для порождения я не знаю, как CLR на самом деле устанавливает переменные.

35
задан abatishchev 28 February 2013 в 00:30
поделиться

1 ответ

Отвечая на ваш вопрос, нет. Присвоение двойных значений не гарантируется как атомарное. Документация доступна здесь. В основном, <= 32-битные встроенные типы являются атомарными, >= 64-битные - нет. Для атомарных операций над 64-битными типами можно использовать методы на System.Threading.Interlocked

24
ответ дан 27 November 2019 в 15:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: