我需要使用无锁的多生产者多消费者队列,并且我正在尝试使用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队列似乎没有文档。
答案 0 :(得分:2)
下次尝试使用官方邮件列表,您将更有可能获得回应!
任何动态分配的非阻塞数据结构都需要安全的内存回收。在您的情况下,您还需要使用ck_epoch或类似的机制来安全地管理垃圾内存,仅在安全的情况下释放垃圾。
您的另一种选择是将垃圾放在空闲列表中,并在以后的某个安全点重新使用(这实际上是安全的内存回收将为您完成的工作)。