Я не мог найти любую ссылку на это в документации...
Присвоение является к двойному (или какой-либо другой простой тип, включая булевскую переменную) атомарной операцией, просматриваемой с точки зрения потоков?
double value = 0;
public void First() {
while(true) {
value = (new Random()).NextDouble();
}
}
public void Second() {
while(true) {
Console.WriteLine(value);
}
}
В этом примере кода первый метод называют в одном потоке и втором в другом. Второй метод может получить испорченное значение, если это получает свое выполнение во время присвоения на переменную в другом потоке?
Я не забочусь, получаю ли я старое значение, только важно получить допустимое значение (не тот, где 2 из 8 байтов установлены). Я знаю, что это - глупый вопрос, но я хочу быть уверенным, для порождения я не знаю, как CLR на самом деле устанавливает переменные.
Отвечая на ваш вопрос, нет. Присвоение двойных значений не гарантируется как атомарное. Документация доступна здесь. В основном, <= 32-битные встроенные типы являются атомарными, >= 64-битные - нет. Для атомарных операций над 64-битными типами можно использовать методы на System.Threading.Interlocked