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

В отличие от других частей CK, очередь MPMC, похоже, не имеет документации.


person MachPortMassenger    schedule 30.05.2019    source источник


Ответы (1)


Попробуйте официальный список рассылки в следующий раз, у вас будет больше шансов получить ответ!

Любая динамически выделяемая неблокирующая структура данных потребует безопасного освобождения памяти. В вашем случае вам также потребуется использовать ck_epoch или аналогичный механизм, чтобы безопасно управлять памятью мусора, освобождая ее только тогда, когда это безопасно.

Другой вариант для вас - поместить мусор в свободный список и повторно использовать его в какой-то безопасной точке позже (что, по сути, и сделает для вас безопасное освобождение памяти).

person sbahra    schedule 09.08.2019