About spinlock implementation
qznc via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Sep 1 00:46:04 PDT 2016
On Thursday, 1 September 2016 at 06:44:13 UTC, mogu wrote:
> I found an implementation of spinlock in concurrency.d.
> ```
> static shared struct SpinLock
> {
> void lock() { while (!cas(&locked, false, true)) {
> Thread.yield(); } }
> void unlock() { atomicStore!(MemoryOrder.rel)(locked,
> false); }
> bool locked;
> }
> ```
> Why atomicStore use MemoryOrder.rel instead of MemoryOrder.raw?
I'm not sure I understand rel [0], but raw is too weak. Raw means
no sequencing barrier, so
local_var = protected_value;
spinlock.unlock();
could be transformed (by compiler or CPU) to
spinlock.unlock();
local_var = protected_value;
This effectively makes the access to the protected value
unprotected and nullifies the effect of the spinlock.
I find the documentation on MemoryOrder lacking about the
semantics of rel. :(
[0] https://dlang.org/library/core/atomic/memory_order.html
More information about the Digitalmars-d-learn
mailing list