gpt4 book ai didi

c++ - boost::lockfree:queue 中的内存排序

转载 作者:行者123 更新时间:2023-12-02 01:32:12 30 4
gpt4 key购买 nike

考虑以下结构:

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,所以你应该很好!

关于c++ - boost::lockfree:queue 中的内存排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586922/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com