首页 > 解决方案 > 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,我的假设是garbagedequeue 的参数只会返回一个指向入队内存的指针。但是如果我只是调用 free on *garbage,代码就会崩溃。如果我不释放,就会有内存泄漏。

与 CK 的其他部分不同,MPMC 队列似乎没有文档。

标签: concurrencylock-free

解决方案


下次试试官方邮件列表,你会更有可能得到回复!

任何动态分配的非阻塞数据结构都需要安全的内存回收。在您的情况下,您还需要使用 ck_epoch 或类似的机制来安全地管理垃圾内存,只有在安全的情况下才释放它。

您的另一个选择是将垃圾放在空闲列表中并稍后在某个安全点重新使用它(这实际上是安全内存回收将为您做的事情)。


推荐阅读