Boost.Log не поддерживает fork (). Это невероятно, но комментарий к билету описывает обходной путь:
[..] так что на данный момент пользователи могут повторно инициализировать библиотеку в fork. Вы можете использовать pthread_atfork для такой повторной инициализации.
Таким образом, мой вопрос: как именно я могу повторно инициализировать Boost.Log после fork ()?
Пример кода высоко ценится.
Вы должны позаботиться обо всех раковинах и воссоздать их в pthread_atfork
обработчик у ребенка процесс_. То есть add_console_log
или же add_file_log
функции возвращают boost::shared_ptr
в раковину. Сбросьте это и инициализируйте
это снова.
...
boost::shared_ptr<
sinks::synchronous_sink< sinks::text_ostream_backend >
> console_sink = logging::add_console_log();
...
void fork_child_handler(void)
{
console_sink = logging::add_console_log();
return;
}
// in some global setup code of your application
pthread_atfork(NULL /*prepare*/,
NULL /* parent */,
&fork_child_handler);
Позаботься, чтобы fork
может оставить больше вещей, чем просто сломано
бревно Держитесь подальше от многопоточности и fork
во всех смыслах
(Ирония в том, что библиотека pthread предоставляет обработчик для fork,
которых вы хотите избежать, если есть темы …).
Других решений пока нет …