线程安全使用单例模式,保证了每次只创建单个对象,代码如下:

Singleton.h

  1. // Use of this source code is governed by a BSD-style license
  2. // that can be found in the License file.
  3. //
  4. // Author: Shuo Chen (chenshuo at chenshuo dot com)
  5. //线程安全
  6. #ifndef MUDUO_BASE_SINGLETON_H
  7. #define MUDUO_BASE_SINGLETON_H
  8. //单例
  9. #include <boost/noncopyable.hpp>
  10. #include <pthread.h>
  11. #include <stdlib.h> // atexit
  12. namespace muduo
  13. {
  14. template<typename T>
  15. class Singleton : boost::noncopyable//继承自noncopyable表示不可被拷贝
  16. {
  17. public:
  18. static T& instance()//返回该类单例对象
  19. {
  20. pthread_once(&ponce_, &Singleton::init);//ponce_能够保证该函数只被执行一次,而且能够保证线程安全
  21. return *value_;
  22. }
  23. private:
  24. Singleton();//构造函数
  25. ~Singleton();//析构函数
  26. static void init()//在内部创建的对象
  27. {
  28. value_ = new T();
  29. ::atexit(destroy);//在程序结束的时候会自动调用destroy
  30. }
  31. static void destroy()//在内部销毁的对象
  32. {//这句保证了T是一个完全类型的类,否则该数组的大小为-1,编译时会产生警告
  33. typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
  34. delete value_;
  35. }
  36. private:
  37. static pthread_once_t ponce_;//这个对象能够保证一个函数只被执行一次
  38. static T* value_;
  39. };
  40. template<typename T>
  41. pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;
  42. template<typename T>
  43. T* Singleton<T>::value_ = NULL;
  44. }
  45. #endif

测试代码如下,该代码在主线程中创建一个单例对象,然后在子线程中改变该对象的名称,由于是单例对象,最后主线程打印的时候名称也是改变了的

  1. //线程安全测试程序
  2. #include <muduo/base/Singleton.h>
  3. #include <muduo/base/CurrentThread.h>
  4. #include <muduo/base/Thread.h>
  5. #include <boost/noncopyable.hpp>
  6. #include <stdio.h>
  7. //定义Test类
  8. class Test : boost::noncopyable
  9. {
  10. public:
  11. Test()
  12. {//%p是指针的值
  13. printf("tid=%d, constructing %p\n", muduo::CurrentThread::tid(), this);
  14. }
  15. ~Test()
  16. {
  17. printf("tid=%d, destructing %p %s\n", muduo::CurrentThread::tid(), this, name_.c_str());
  18. }
  19. const muduo::string& name() const { return name_; }
  20. void setName(const muduo::string& n) { name_ = n; }//设置名称
  21. private:
  22. muduo::string name_;//名称
  23. };

单独编译后运行结构如下:

muduo网络库源码学习————线程安全的更多相关文章

  1. muduo网络库源码学习————线程池实现

    muduo库里面的线程池是固定线程池,即创建的线程池里面的线程个数是一定的,不是动态的.线程池里面一般要包含线程队列还有任务队列,外部程序将任务存放到线程池的任务队列中,线程池中的线程队列执行任务,也 ...

  2. muduo网络库源码学习————线程类

    muduo库里面的线程类是使用基于对象的编程思想,源码目录为muduo/base,如下所示: 线程类头文件: // Use of this source code is governed by a B ...

  3. muduo网络库源码学习————线程特定数据

    muduo库线程特定数据源码文件为ThreadLocal.h //线程本地存储 // Use of this source code is governed by a BSD-style licens ...

  4. muduo网络库源码学习————线程本地单例类封装

    muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...

  5. muduo网络库源码学习————Timestamp.cc

    今天开始学习陈硕先生的muduo网络库,moduo网络库得到很多好评,陈硕先生自己也说核心代码不超过5000行,所以我觉得有必要拿过来好好学习下,学习的时候在源码上面添加一些自己的注释,方便日后理解, ...

  6. muduo网络库源码学习————互斥锁

    muduo源码的互斥锁源码位于muduo/base,Mutex.h,进行了两个类的封装,在实际的使用中更常使用MutexLockGuard类,因为该类可以在析构函数中自动解锁,避免了某些情况忘记解锁. ...

  7. muduo网络库源码学习————日志滚动

    muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天.滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc #in ...

  8. muduo网络库源码学习————日志类封装

    muduo库里面的日志使方法如下 这里定义了一个宏 #define LOG_INFO if (muduo::Logger::logLevel() <= muduo::Logger::INFO) ...

  9. muduo网络库源码学习————无界队列和有界队列

    muduo库里实现了两个队列模板类:无界队列为BlockingQueue.h,有界队列为BoundedBlockingQueue.h,两个测试程序实现了生产者和消费者模型.(这里以无界队列为例,有界队 ...

随机推荐

  1. css怪异盒模型和弹性盒布局(flex)详解及其案例

    一.怪异盒模型 怪异盒模型的属性是box-sizing,他有两个属性值: 1.content-box 这是由 CSS2.1 规定的宽度高度行为.宽度和高度分别应用到元素的内容框.在宽度和高度之外绘制元 ...

  2. JAVA中基本类型和包装类之间的相互转换

    转自:https://www.imooc.com/code/2250 仅做个人学习记录之用,侵删. 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 ...

  3. 数据结构和算法(Golang实现)(17)常见数据结构-树

    树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...

  4. .Net Core MVC 基于Cookie进行用户认证

    在打代码之前先说一下思路. 登录的的时候服务端生成加密的字符串(用户名.id.当前时间)并且存入客户端cookie中,服务端的缓存中.对客户端的每次请求进行拦截,解密保存在cookie中的加密字符串. ...

  5. AJ学IOS(06)UI之iOS热门游戏_超级猜图

    AJ分享,必须精品 先看效果图 思路 需求分析 1,搭建界面 1>上半部分,固定的,用Storyboard直接连线(OK) 2>下半部分,根据题目的变化,不断变化和调整,用代码方式实现比较 ...

  6. 第一节:python基础

    2020-03-29 python基础: 多种python版本,直接编码让c解释的是cpython,pypy是最快的python 编码:ascll码只能表示256种无法表示中文,utf8个根据字符长短 ...

  7. Web三维编程入门总结之一:WebGL与Threejs入门知识

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  8. Daily Scrum 12/25/2015

    Process: Zhaoyang: Implement the Alex 50M model in the Caffe framework. Yandong: The Azure Back end ...

  9. stand up meeting 12/18/2015 ~12/20/2015(weekend)

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云    完成主页面设计和非功能性PDF reader UI设计实现 ...

  10. CVE 2019-0708 漏洞复现+

    PART 1 参考链接:https://blog.csdn.net/qq_42184699/article/details/90754333 漏洞介绍: 当未经身份验证的攻击者使用 RDP 连接到目标 ...