concurrency - ConcurrencyKit ck_fifo_mpmc_dequeue 和内存释放
问题描述
我需要使用无锁多生产者多消费者队列,并且我正在尝试使用ConcurrencyKit fifo_mpmc 代码。我设法根据回归代码中的示例使代码工作,除了,没有关于如何在从 MPMC 队列中取出一个条目后释放内存的文档。
特别是,在下面的函数原型中,
CK_CC_INLINE static bool
ck_fifo_mpmc_dequeue(struct ck_fifo_mpmc *fifo,
void *value,
struct ck_fifo_mpmc_entry **garbage)
究竟garbage
对应的是什么,如何释放在入struct ck_fifo_mpmc_entry
队期间分配的类型的内存?以下是 enquque 的类型声明
CK_CC_INLINE static void
ck_fifo_mpmc_enqueue(struct ck_fifo_mpmc *fifo,
struct ck_fifo_mpmc_entry *entry,
void *value)
需要为 分配动态内存的地方entry
,我的假设是garbage
dequeue 的参数只会返回一个指向入队内存的指针。但是如果我只是调用 free on *garbage
,代码就会崩溃。如果我不释放,就会有内存泄漏。
与 CK 的其他部分不同,MPMC 队列似乎没有文档。
解决方案
下次试试官方邮件列表,你会更有可能得到回复!
任何动态分配的非阻塞数据结构都需要安全的内存回收。在您的情况下,您还需要使用 ck_epoch 或类似的机制来安全地管理垃圾内存,只有在安全的情况下才释放它。
您的另一个选择是将垃圾放在空闲列表中并稍后在某个安全点重新使用它(这实际上是安全内存回收将为您做的事情)。
推荐阅读
- python-3.6 - 尝试安装到 virtualenv 时出现 Pipenv 错误
- android - SecurityException:调用者不再运行,上次停止
- maven-3 - 如何解决“产品不包含强制属性'版本'。请确保您在产品文件中输入了版本”
- javascript - 无法从滚动条中选择视频的搜索时间
- javascript - 错误:捆绑失败:TypeError:无法读取 null 的属性“绑定”
- android - 在某些 Android 设备中,CalenderPickerView 显示任何日期的错误日期
- firebase - 如何在另一个屏幕上从 MIT App Inventor 2 上的 firebase 获取数据
- amazon-web-services - phpmyadmin 无法在亚马逊 ec2 实例上的 linux ami 中的 nginx Web 服务器上工作
- node.js - Socket.io 处理在线/离线状态
- elasticsearch - 计算弹性搜索中的不同值