2015-12-25 24 views
0

我在我的多线程项目中使用boost.log,但是我不需要线程安全的版本记录器,因为我已经让代码以线程安全的方式运行。make boost :: log :: core thread local

如果使用非线程安全记录器,我需要使记录器对象为thread_local:每个线程都有自己的记录器对象。但是该对象隐藏在boost.log的API后面:要创建一个记录器对象,用户不能将该对象定义为type obj;它的创建是由像BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULTI这样的宏完成的,并通过logging::core::get()得到。我不能只是这样写:

thread_local boost::core::logger logger_obj; 

如何做到这一点?

+0

我认为boost :: log是线程安全的吗? –

回答

0

是的,你可以创建线程本地存储记录器,几乎完全一样,你写道:

thread_local boost::log::sources::logger logger_obj; 

测井核心,但是,不能进行本地线程,因为它包含引用水槽和使用同时由所有线程的所有记录器。

+0

我有混合记录核心和记录器。如果日志记录核心必须是全局单例,那么通过使日志记录程序成为本地线程,可以节省多少次线程同步?由于接收器仍然无法解锁,因为它被添加到日志记录核心中,所以我认为保存非常小,是吗? – jean

+0

这取决于有问题的记录器上存在多少线程争用。至于日志记录核心,它可以在某些情况下并行处理日志记录 - 特别是当有多个接收器时。如果有一个(同步)接收器和大量记录传递给它,那么它可能会成为一个瓶颈。 –

+0

想问另外一个问题:沉槽螺纹安全性与测井核心螺纹安全性有什么区别?添加unlocked_sink到mt记录核心是不正确的用法? – jean