首页 > 解决方案 > boost::lockfree:queue 中的内存排序

问题描述

考虑以下结构:

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

标签: c++multithreadingboostatomiclock-free

解决方案


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


推荐阅读