tl; dr: Как мне настроить cJSON для выделения памяти в дочерних процессах, чтобы родитель мог видеть результирующие структуры?
У меня есть запрос, который перечисляет несколько продуктов, для которых должны быть сгенерированы и возвращены как JSON.В настоящее время мой код является однопоточным и использует библиотеку cJSON для составления и упорядочивания JSON.
Поскольку сводные данные являются дорогостоящими в вычислительном отношении (пользователь запрашивает выполнение определенных вычислений как часть сводок), я бынапример, fork(2)
для каждого запрошенного продукта, затем его выборка, обработка и суммирование в cJSON_Object
(технически cJSON*
, но "конструктор" - cJSON_CreateObject
)и затем заставляет родительский поток ждать, пока все дочерние элементы не вернут свои cJSON_Object
объекты, чтобы объединиться, выполнить некоторую постобработку, а затем, наконец, маршалировать в строку для возврата.Из-за постобработки я хотел бы вернуть родительскому элементу cJSON_Object
вместо того, чтобы дочерние потоки возвращали строки.
Теперь я вижу cJSON.h:144 CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)
, который принимаетcJSON.h:125 struct internal_hooks
, который позволяет вам задавать пользовательские реализации malloc()
и free()
... что было бы замечательно, если бы я мог найти версии, которые выделяют общую память ... и разделяют тот же тип.Самым близким, что я нашел, был shmalloc
/ shfree
, но это из библиотеки OpenMPI , и это выглядит просто излишним для того, что должно быть простыми рабочими потоками ...
Теперь, , вот где я застрял , как вернуть граф структур cJSON из дочерних процессов в родительский ?
Я приложил самое лучшее (хотя и не проверенное) решение, о котором я подумал, чтобы не загромождать этот вопрос.
PS - Желательно, чтобы решение былоограничимся API POSIX, но приемлем только Linux и дополнительные библиотеки в качестве крайней меры.