请考虑以下结构:
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
,所以你应该很好!