Low-Lock Singletons In D

Steven Schveighoffer schveiguy at yahoo.com
Tue May 7 15:12:16 PDT 2013


On Tue, 07 May 2013 16:02:08 -0400, Dmitry Olshansky  
<dmitry.olsh at gmail.com> wrote:

> 07-May-2013 23:49, Andrei Alexandrescu пишет:
>> On 5/7/13 12:46 PM, Steven Schveighoffer wrote:
>>> On Tue, 07 May 2013 12:30:05 -0400, deadalnix <deadalnix at gmail.com>
>>> wrote:
>>>
> [snip]
>>>>
>>>> That is incorrect as the thread not going into the lock can see a
>>>> partially initialized object.
>>>
>>> The memory barrier prevents that. You don't store the variable until  
>>> the
>>> object is initialized. That is the whole point.
>>
>> A memory barrier is not a one-way thing, i.e. not only the writer must
>> do it. Any operation on shared memory is a handshake between the writer
>> and the reader. If the reader doesn't do its bit, it can see the writes
>> out of order no matter what the writer does.
>>
> Exactly.
>

So the memory barrier ensures that neither the compiler nor the processor  
can re-order the stores to memory.

But you are saying that the *reader* must also put in a memory barrier,  
otherwise it might see the stores out of order.

It does not make sense to me, how does the reader see a half-initialized  
object, when the only way it sees anything is when it's stored to main  
memory *and* the stores are done in order?

So that must not be what it is doing.  What it must be doing is storing  
out of order, BUT placing a prevention mechanism from reading the memory  
until the "release" is done?  Kind of like a minuscule mutex lock.  So  
while it is out-of-order writing the object data, it holds a lock on the  
reference pointer to that data, so anyone using acquire cannot read it yet?

That actually makes sense to me.  Is that the case?

> Returning to the confusing point.
>
> On x86 things are actually muddied by stronger then required hardware  
> guarantees. And only because of this there no need for explicit read  
> barrier (nor x86 have one) in this case. Still the read operation has to  
> be marked specifically (volatile, asm block, whatever) to ensure the  
> _compiler_ does the right thing (no reordering of across it).

I would think the model Mehrdad used would be sufficient to prevent  
caching of the data, since it is a virtual, no?

-Steve


More information about the Digitalmars-d mailing list