std::atomic<int> flag0(0),flag1(0),turn(0);
void lock(unsigned index)
{
if (0 == index)
{
flag0.store(1, std::memory_order_relaxed);
turn.exchange(1, std::memory_order_acq_rel);
//turn.store(1)
while (flag1.load(std::memory_order_acquire)
&& 1 == turn.load(std::memory_order_relaxed))
std::this_thread::yield();
}
else
{
flag1.store(1, std::memory_order_relaxed);
turn.exchange(0, std::memory_order_acq_rel);
//turn.store(0)
while (flag0.load(std::memory_order_acquire)
&& 0 == turn.load(std::memory_order_relaxed))
std::this_thread::yield();
}
}
void unlock(unsigned index)
{
if (0 == index)
{
flag0.store(0, std::memory_order_release);
}
else
{
flag1.store(0, std::memory_order_release);
}
}
turn.exchange(0),不带左(使用像void return函数一样),其功能类似于'turn.store(0)'。
有没有理由使用'exchange'方法?
在此算法中,此代码不需要保存以前的值。
C0]的使用商店memory_order_seq_cst
”完成该工作。使用交换器memory_order_acq_rel
与x86交换上的主要区别在于,它转换为顺序一致