我遇到了一个支持多生产者和消费者的无锁队列,该队列的推入操作像这样
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:
old
)钩入新项old
)是*这是真的,因此交换将成功线程2:
old
)钩入其新项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();