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

Reply via email to