Является ли присвоение переменной и чтение атомарной операции? - PullRequest
35 голосов
/ 29 апреля 2010

Мне не удалось найти ссылку на это в документации ...

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

double value = 0;

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

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

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

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

1 Ответ

24 голосов
/ 29 апреля 2010

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

...