1 2 3 4 5 6 7 8 9 10 11 12 | class Logger { private: Logger() { } public: static void Init(const std::string &name); static Logger *GetInstance(); void Write(const char *format, ...); private: static std::string ms_name; static Logger *ms_this_logger; }; |
1 2 3 4 5 6 7 8 9 10 11 12 | class Logger { private: Logger() { } public: static void Init(const std::string &name); static Logger *GetInstance(); void Write(const char *format, ...); private: static boost::thread_specific_ptr<std::string> ms_name; static boost::thread_specific_ptr<Logger> ms_this_logger; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void Logger::Init(const string &name) { if (!name.empty()) { ms_name.reset(new std::string(name)); } } Logger *Logger::GetInstance() { if (ms_this_logger.get() == NULL) { ms_this_logger.reset(new Logger); } return ms_this_logger.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Thread { public: Thread(const char *name) : m_name(name) { } void operator()() { /* set logger name in thread */ Logger::Init(m_name); /* call GetInstance() and Write() in other functions with thread-local enabled */ Logger *logger = Logger::GetInstance(); for (int i = 0; i < 3; i++) { logger->Write("Hello %d", i); #ifdef _WIN32 Sleep(1000); #else sleep(1); #endif } } private: string m_name; }; int main() { boost::thread t1(Thread("name1")); boost::thread t2(Thread("name2")); t1.join(); t2.join(); return 0; } |
1 2 3 4 5 6 7 | # ./logger [name1] Hello 0 [name2] Hello 0 [name2] Hello 1 [name2] Hello 1 [name2] Hello 2 [name2] Hello 2 |
1 2 3 4 5 6 7 | # ./logger2 [name1] Hello 0 [name2] Hello 0 [name1] Hello 1 [name2] Hello 1 [name1] Hello 2 [name2] Hello 2 |
1 2 3 4 5 6 7 8 9 | boost::thread_specific_ptr::reset() --> boost::detail::set_tss_data() --> boost::detail::get_or_make_current_thread_data() --> boost::detail::get_current_thread_data() --> ::TlsGetValue() # reference: # ${BOOST_SRC}/boost/thread/tss.hpp # ${BOOST_SRC}/lib/thread/src/win32/thread.cpp |
1 2 3 4 5 6 7 8 9 10 | boost::thread_specific_ptr::reset() --> boost::detail::set_tss_data() --> boost::detail::add_new_tss_node() --> boost::detail::get_or_make_current_thread_data() --> boost::detail::get_current_thread_data() --> ::pthread_getspecific() # reference: # ${BOOST_SRC}/boost/thread/tss.hpp # ${BOOST_SRC}/lib/thread/src/pthread/thread.cpp |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |