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