Обновление : Я только что наткнулся на это в Ответ Эрика Липперта на другой вопрос (он цитирует спецификацию):
Чтение и запись других типов,
в том числе длинный, удлиненный, двойной и
десятичный, а также определяемый пользователем
типы, не гарантируется
атомарный.
ОК, поэтому чтение double
является , а не атомарным. Это означает, что значение может измениться в середине чтения, верно? Так как же можно атомарно прочитать значение double
?
Я заметил, что есть Interlocked.Read
метод для long
значений. Это имеет смысл для меня, поскольку чтение 64-битного значения должно потребовать двух шагов и, следовательно, должно зависеть от условий гонки, как и любое другое неатомарное действие.
Но для double
значений Interlocked.Read
нет, хотя System.Double
является 64-битным значением.
Я вижу странное поведение в моей программе, когда мой графический интерфейс, который отображает double
в текстовом поле, в то время как double
также часто обновляется другими потоками, показывает правильное значение (вблизи 200,0) большинство времени, а затем случайным образом показывает ошибочное значение (например, -0,08) иногда .
Может быть, это проблема с потоками, или, может быть, это что-то еще. Но сначала я хотел сузить возможности. Итак: чтение double
потокобезопасно?