使用compare_exchange_weak

时间:2019-10-16 13:57:39

标签: c++ multithreading atomic compare-and-swap stdatomic

我遇到了一个支持多生产者和消费者的无锁队列,该队列的推入操作像这样

inline void push(LT* item)
{

    LT *old = pushlist.load(std::memory_order_relaxed);
    do {
        item->next = old;
    } while (!pushlist.compare_exchange_weak(old, item, 
                                             std::memory_order_release));
}

pushlist是一个原子指针变量,我正在考虑在此代码上有两个线程的情况

线程1:

  • T1#加载指针(不会锁定#)
  • T2#循环播放并将头部(old)钩入新项
  • T3#现在在cmpxchg(LOCK#);中它期望head(old)是*这是真的,因此交换将成功

线程2:

  • T2#加载指针(不会锁定#)
  • T3#循环并将头部(old)钩入其新项
  • T4#现在cmpxchg将期望head(old)为* this-我猜这不是,因为Thread1已经更改了它,所以old不再是head,操作将会失败...现在,它不会旋转吗?

我测试了它,可以正常工作,但是我不清楚它是如何工作的。

auto work = [&p](auto name){
    int i{0};
    linked_item<int> dummy{};
    for(; i < 100 ; ++i){
        p.push(&dummy);
    }
    std::cout<<name<<" finished"<< i << "\n";
};
std::thread t1{work, "t1"}, t2{work, "t2"};
t1.join(); t2.join();

0 个答案:

没有答案