区别btw原子交换(不返回val)并存储?关于具有原子lib

问题描述 投票:1回答:2
的Peterson算法
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'方法?

在此算法中,此代码不需要保存以前的值。

c++ atomic atomicity
2个回答
0
投票

C0]的使用商店memory_order_seq_cst

”完成该工作。使用交换器

memory_order_acq_rel


0
投票

与x86交换上的主要区别在于,它转换为顺序一致

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.