On Monday, 6 May 2013 at 18:56:08 UTC, Dmitry Olshansky wrote:
Thanks for the detailed explanation!
And now compiler/CPU decides to optimize/execute out of order
(again, it's an illustration) it as:
lock _static_mutex;
x = alloc int;
//even if that's atomic
static_ = x;
// BOOM! somebody not locking mutex may already
// see static_ in "half-baked" state
x[0] = 42;
unlock _static_mutex;
That's exactly the same as the classic double-checked lock bug,
right?
As I wrote in my original code -- and as you also mentioned
yourself -- isn't it trivially fixed with a memory barrier?
Like maybe replacing
_static = new ActualValue<T>();
with
var value = new ActualValue<T>();
_ReadWriteBarrier();
_static = value;
Wouldn't this make it correct?
Are't pointer writes always atomic?
In short - no. Even not counting the world of legal
re-ordering, unaligned writes
But my example was completely aligned...