Мне нужно использовать безблокировочную очередь с несколькими производителями и несколькими потребителями, и я пытаюсь использовать код 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 просто вернет указатель на поставленную в очередь память. Но если я просто позвоню бесплатно на *garbage
, код выйдет из строя. Если я не освобождаюсь, происходит утечка памяти.
В отличие от других частей CK, очередь MPMC, похоже, не имеет документации.