内存排序在提升::无锁:队列

Memory ordering in boost::lockfree:queue

本文关键字:无锁 队列 排序 内存      更新时间:2023-10-16

请考虑以下结构:

struct T { 
~T() { delete[] buff; }
int* buff = nullptr; };
T* t = new T();
auto queue = boost::lockfree::queue<T*>(0);
// Thread A
t->buff = int[10];
queue.push(t);
// Thread Z
T* t = nullptr;
while(true)
if(queue.pop(t))
delete t; // Is this OK? If not, what kind of synchronization I need to make it OK?

一般的问题是不同的线程(A 到 Y(在共享指针(不是 std::shared_ptr(上协同工作。在某些时候,除了线程 A 之外,没有人使用指针t线程 A 可以看到其他人对*t所做的一切,因此线程 A 可以安全地调用delete t。相反,它将t推送到队列中,线程 Z 从队列中弹出并执行delete t。问题是我们如何确保线程 Z 看到分配给t->buff的最后一个值?boost::lockfree::queue是否有任何同步可以保证这一点?或者我们需要自己做点什么(什么(?

是的,这是安全的!您对从队列中弹出的值拥有唯一的所有权。push必须使用memory_order_release(或更强(,pop必须使用memory_order_acquire(或更强(,因为否则实现将完全无用(你不能用你刚刚从队列中弹出的指针做什么(。我没查过代码,但是你说实现用memory_order_seq_cst,所以你应该很好!