如何使用线程局部存储实现多线程下的日志系统
发布时间:2016-10-17 11:25:01 所属栏目:Unix 来源:站长网
导读:副标题#e# 概述 通常来说,在应用程序中需要日志来记录程序运行的状态,以便后期问题的跟踪定位。在日志系统的设计中,通常会有一个总的日志系统来统一协调这些日志的设置如位置、输出级别和内容等。在多线程编程中,当每个线程都需要输出日志时,因为要考
实现代码中,调用 boost::thread_specific_ptr 类的 reset()函数来设值。下面是两个 Logger 类的简单调用代码,它创建的两个线程,在每个线程中设置 Logger 的名字: 清单 4. Logger 类的调用代码 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; } 对于 Logger 的初始版本,输出可能是这样: 清单 5. 初始版本 Logger 类的输出 # ./logger [name1] Hello 0 [name2] Hello 0 [name2] Hello 1 [name2] Hello 1 [name2] Hello 2 [name2] Hello 2 第二个线程重新对 name 赋值了之后,第一个线程也收到了影响。对于使用线程局部存储的 Logger,输出如下: 清单 6. 使用线程局部存储的 Logger 类的输出 # ./logger2 [name1] Hello 0 [name2] Hello 0 [name1] Hello 1 [name2] Hello 1 [name1] Hello 2 [name2] Hello 2 两个线程中的 name 变量互相独立,分别打印出了正确的值。boost 库的实现 boost 库是怎么实现线程局部存储的呢?通过跟踪代码,以下分别是 Windows 和 Linux 平台的调用栈(基于 1.43 版): (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |