Как переинициализировать библиотеку Boost Log на форке?

Boost.Log не поддерживает fork (). Это невероятно, но комментарий к билету описывает обходной путь:

[..] так что на данный момент пользователи могут повторно инициализировать библиотеку в fork. Вы можете использовать pthread_atfork для такой повторной инициализации.

Таким образом, мой вопрос: как именно я могу повторно инициализировать Boost.Log после fork ()?

Пример кода высоко ценится.

8

Решение

Вы должны позаботиться обо всех раковинах и воссоздать их в 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,
которых вы хотите избежать, если есть темы …).

1

Другие решения

Других решений пока нет …