c++ - 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
可以保证这一点?或者我们需要自己做点什么(什么)?
解决方案
是的,这是安全的!您对从队列中弹出的值拥有唯一所有权。push
必须使用memory_order_release
(或更强)并且pop
必须使用memory_order_acquire
(或更强),否则实现将完全没用(你不能对刚刚从队列中弹出的指针做任何事情)。我没有检查代码,但是你说实现使用了memory_order_seq_cst
,所以你应该很好!
推荐阅读
- javascript - 如何在 JS 函数中对变量创建闭包?
- python-3.x - 如何删除 x 轴子图上的重复值和空值或未标记值
- powershell - Powershell:根据特定条件更改 CSV 文件中的值
- onelogin - 帐户品牌 - 创建自定义电子邮件设置 API
- excel - Workbook.Add 命令添加的工作簿在任务栏中不可见
- android - 有没有办法用 StateFlow 参数预览 compose 函数?
- c++ - C++“表达式必须具有整数或无范围枚举类型”错误
- java - 我的 JSP 页面中的错误:无法解析导入 java.util.List
- java - 错误:对于属性“吉他手”:找不到匹配的编辑器或转换策略
- python - 如何在 Mystic 中使用线性符号不等式创建约束?