2015-12-25 39 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