内存排序在提升::无锁:队列
Memory ordering in 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(上协同工作。在某些时候,除了线程 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
,所以你应该很好!
相关文章:
- 内存排序在提升::无锁:队列
- std::list 可以用于简单的无锁队列吗?
- 无锁队列实现中的虚假下溢C++
- Boost 无锁队列断言用于简单的赋值和析构函数
- 可以检查提升::无锁::队列是否已满吗?
- 两个提升的无锁队列会导致僵局
- C++无锁队列与多个线程一起崩溃
- 寻找对我的线程安全,无锁队列实施的批评
- 我可以放一个lambdas的无锁队列吗?
- 比较提升::无锁::spsc_queue、提升::无锁::队列、串行队列操作
- C++11 使用 std::atomic(多写入器,单使用者)的无锁队列
- Boost 的无锁队列是否有可能丢失元素?
- 可变长度的无锁队列
- 在fixed_sized<true>的情况下提高无锁队列行为
- 一个并发队列或8个无锁队列更快
- boost::Eigen的无锁队列::MatrixXf
- 在c++中实现一个多生产者/消费者无锁队列
- 为无锁队列添加阻塞函数
- 提升c++无锁队列与共享队列的对比
- 无锁队列,加载与卸载CPU