Boost.Log 不支持 fork()。这有点令人难以置信,但票务评论描述了一种解决方法:
[..] 所以现在由用户在 fork 重新初始化库。您可以使用 pthread_atfork 进行此类重新初始化。
因此我的问题是:我如何在 fork() 之后重新初始化 Boost.Log?
非常感谢代码示例。
您必须处理所有接收器,并在子pthread_atfork
进程的处理程序中重新创建它们_ 。即or函数将 a 返回到接收器。重置它,然后再次初始化它。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 提供了处理程序,如果有线程,您希望避免这种情况......)。