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