加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

如何使用线程局部存储实现多线程下的日志系统

发布时间:2016-09-28 19:58:40 所属栏目: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 版):

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读