Update: I just stumbled upon this in Eric Lippert's answer to another question (he is quoting the spec):
Reads and writes of other types,
including long, ulong, double, and
decimal, as well as user-defined
types, are not guaranteed to be
atomic.
OK, so reading a double
is not atomic. This means the value could get modified mid-read, right? So how does one read a double
value atomically?
I notice there's an Interlocked.Read
method for long
values. This makes sense to me, as reading a 64-bit value must require two steps and therefore be subject to race conditions just like every other non-atomic action.
But there's no Interlocked.Read
for double
values, even though System.Double
is a 64-bit value.
I am seeing some strange behavior in my program where my GUI, which displays a double
in a text box while that double
is also being frequently updated by other threads, is showing the correct value (in the vicinity of 200.0) most of the time, and then randomly showing an erroneous value (like -0.08) occasionally.
Maybe this is a threading issue, or maybe it's something else. But first off I wanted to narrow down the possiblities. So: is reading a double
thread-safe?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…