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;

could be transformed (by compiler or CPU) to

  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

Reply via email to