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