ConcurrencyKit ck_fifo_mpmc_dequeue和内存释放

时间:2019-05-30 22:15:37

标签: concurrency lock-free

我需要使用无锁的多生产者多消费者队列,并且我正在尝试使用ConcurrencyKit fifo_mpmc代码。我设法根据regression code中的示例使代码正常工作,除了没有文档说明如何从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参数只会返回指向已排队内存的指针。但是,如果我只是在*garbage上免费打电话,代码就会崩溃。如果我不释放空间,则会发生内存泄漏。

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

1 个答案:

答案 0 :(得分:2)

下次尝试使用官方邮件列表,您将更有可能获得回应!

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

您的另一种选择是将垃圾放在空闲列表中,并在以后的某个安全点重新使用(这实际上是安全的内存回收将为您完成的工作)。