1.ThreadLocalSigleton<T>类图

每一个线程都有一个T类型的单例对象

线程特定数据:

(1)POD类型可以使用__thread

(2)非POD类型使用pthread_key_create

2.代码

ThreadLocalSingleton.h

// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)#ifndef MUDUO_BASE_THREADLOCALSINGLETON_H
#define MUDUO_BASE_THREADLOCALSINGLETON_H#include <boost/noncopyable.hpp>
#include <assert.h>
#include <pthread.h>namespace muduo
{template<typename T>
class ThreadLocalSingleton : boost::noncopyable
{public:static T& instance(){if (!t_value_){t_value_ = new T();deleter_.set(t_value_);}return *t_value_;}static T* pointer(){return t_value_;}private:static void destructor(void* obj){assert(obj == t_value_);typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];delete t_value_;t_value_ = 0;}class Deleter{public:Deleter(){pthread_key_create(&pkey_, &ThreadLocalSingleton::destructor);}~Deleter(){pthread_key_delete(pkey_);}void set(T* newObj){assert(pthread_getspecific(pkey_) == NULL);pthread_setspecific(pkey_, newObj);}pthread_key_t pkey_;};static __thread T* t_value_;static Deleter deleter_;
};template<typename T>
__thread T* ThreadLocalSingleton<T>::t_value_ = 0;template<typename T>
typename ThreadLocalSingleton<T>::Deleter ThreadLocalSingleton<T>::deleter_;}
#endif

ThreadLocalSingleton_test.cc

#include <muduo/base/ThreadLocalSingleton.h>
#include <muduo/base/CurrentThread.h>
#include <muduo/base/Thread.h>#include <boost/bind.hpp>
#include <boost/noncopyable.hpp>
#include <stdio.h>class Test : boost::noncopyable
{public:Test(){printf("tid=%d, constructing %p\n", muduo::CurrentThread::tid(), this);}~Test(){printf("tid=%d, destructing %p %s\n", muduo::CurrentThread::tid(), this, name_.c_str());}const std::string& name() const { return name_; }void setName(const std::string& n) { name_ = n; }private:std::string name_;
};void threadFunc(const char* changeTo)
{printf("tid=%d, %p name=%s\n",muduo::CurrentThread::tid(),&muduo::ThreadLocalSingleton<Test>::instance(),muduo::ThreadLocalSingleton<Test>::instance().name().c_str());muduo::ThreadLocalSingleton<Test>::instance().setName(changeTo);printf("tid=%d, %p name=%s\n",muduo::CurrentThread::tid(),&muduo::ThreadLocalSingleton<Test>::instance(),muduo::ThreadLocalSingleton<Test>::instance().name().c_str());// no need to manually delete it// muduo::ThreadLocalSingleton<Test>::destroy();
}int main()
{muduo::ThreadLocalSingleton<Test>::instance().setName("main one");muduo::Thread t1(boost::bind(threadFunc, "thread1"));muduo::Thread t2(boost::bind(threadFunc, "thread2"));t1.start();t2.start();t1.join();printf("tid=%d, %p name=%s\n",muduo::CurrentThread::tid(),&muduo::ThreadLocalSingleton<Test>::instance(),muduo::ThreadLocalSingleton<Test>::instance().name().c_str());t2.join();pthread_exit(0);
}

运行结果:

19muduo_base库源码分析(十)相关推荐

  1. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  2. Cowboy 源码分析(十八)

    在上一篇中,我们整理了下cowboy_http_protocol:header/3函数,在文章的末尾留下2个没有讲到的函数,今天,我们先看下cowboy_http_protocol:error_ter ...

  3. GCC源码分析(十六) — gimple转RTL(pass_expand)(下)

    版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...

  4. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  5. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

  6. surprise库源码分析

    最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...

  7. Python Requests库源码分析

    1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...

  8. 【转】ABP源码分析十九:Auditing

    审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作. AuditInfo:定义如下图中需要被Audit的信息. Aud ...

  9. 【转】ABP源码分析十八:UI Inputs

    以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...

最新文章

  1. Android 布局开发之百分比布局、弹性布局
  2. JS禁止input表单元素手动输入方法(转)
  3. [云炬创业基础笔记]第六章商业模式测试7
  4. dhh basecamp_使Basecamp的薪酬透明化保留了人才
  5. 红帽将停止支持 CentOS 8;​2020 百度沸点揭晓年度知识热词;Qt 6.0 发布|极客头条...
  6. 一些自成系统、完备的教程(链接、博客、github等)
  7. 开启本地git权限_Git入门使用和常见操作
  8. 民间借贷、网贷vs信用卡
  9. 在下载 chromium 源码时错误汇总
  10. python去中心化_EOS区块链dApp去中心化应用汇总
  11. 传奇单职业1.76御天战神强势来袭
  12. powershell下使用linux命令,Win10系统下使用Windows PowerShell运行ABD命令的方法
  13. Distributed Database System —— Multi-raft协议介绍
  14. python 线程通信的几种方式_Python 线程、线程通信、多线程
  15. web入门 命令执行 web29-web41
  16. 检测你的黑苹果系统主板是否支持原生NVRAM
  17. 仿JD商城UI布局达到90%——Android源码
  18. 微信小程序中使用slot插槽
  19. 分布式架构实现概述(大型网站技术架构-读后感)
  20. 5年内被辞退3次,35岁程序员该何去何从?百度,kotlin函数参数

热门文章

  1. MySQL-----pymysql模块
  2. 我对无服务器架构的一些看法
  3. HTTPS 使用成本
  4. sql查询时的左连接,右连接,和内连接详细解释
  5. 程序常用配置文件格式介绍
  6. 结构型设计模式(2)—— 外观模式(Facade Pattern)
  7. 前端处理方式:特殊格式时间转换(2020-11-27T02:58:41.000000Z)
  8. 支持向量机SVM推导
  9. jsp中头的导入两种方式区别
  10. 【BZOJ-18532393】幸运数字Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝