06-May-2013 14:06, Mehrdad пишет:
On Monday, 6 May 2013 at 09:35:59 UTC, Dmitry Olshansky wrote:
You have to read a field to know what to do next, and the other
processor may as well write to it.


That never happens, though. _static is only written to inside a lock,

Yes, but the 1st processor may read _static exactly when the 2nd is inside the lock and writing to that field. Then chances are it will read whatever partial state there is written.

and the check is inside a lock, hence the other processor can't be
writing to it when it's being read...

Surely it can. 1st processor takes the lock and write while the second one reads static_ to call Get.



Maybe I misunderstood what you're saying?
I bet you just mystified the pattern a bit by relying on indirect call.

In pseudo-code what you do is this:


read static_ // 1st processor may be reading here
if static_ is NullValue //that is indirect call
        lock(static_){
                check again
                write static_ //while 2nd one writes here
        }
else
        call static_ -~~-> get

I claim that 'read static_' better be "protected" against that 'write static_' inside the lock.

One way is to ensure write is atomic w.r.t. that particular read operation e.g. by hardware acquire-release, or via both reads/writes being atomic.
On x86 word-sized reads/writes are atomic anyway (iff aligned apparently).

The neat stuff about that TLS pattern was that you need not to rely on hardware specific support.

--
Dmitry Olshansky

Reply via email to