zoukankan      html  css  js  c++  java
  • 【转】C++ 线程安全的单例模式

    http://www.cnblogs.com/ccdev/archive/2012/12/19/2825355.html

    废话不多说,常用的代码积淀下来。

    一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。

    需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.

    使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。

    1、静态成员实例的懒汉模式:

    复制代码
     1 class Singleton  2 {  3 private:  4     static Singleton* m_instance;  5     Singleton(){}  6 public:  7     static Singleton* getInstance();  8 };  9  10 Singleton* Singleton::getInstance() 11 { 12     if(NULL == m_instance) 13     { 14         Lock();//借用其它类来实现,如boost 15         if(NULL == m_instance) 16         { 17             m_instance = new Singleton; 18         } 19         UnLock(); 20     } 21     return m_instance; 22 }
    复制代码

    2、内部静态实例的懒汉模式

    这里需要注意的是,C++0X以后,要求编译器保证内部静态变量的线程安全性,可以不加锁。但C++ 0X以前,仍需要加锁。

    复制代码
     1 class SingletonInside  2 {  3 private:  4     SingletonInside(){}  5 public:  6     static SingletonInside* getInstance()  7     {  8         Lock(); // not needed after C++0x  9         static SingletonInside instance; 10         UnLock(); // not needed after C++0x 11         return instance;  12     } 13 };
    复制代码

    二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。

    由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。

    故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。

    复制代码
     1 class SingletonStatic  2 {  3 private:  4     static const SingletonStatic* m_instance;  5     SingletonStatic(){}  6 public:  7     static SingletonStatic* getInstance()  8     {  9         return m_instance; 10     } 11 }; 12  13 //外部初始化 before invoke main 14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
    复制代码

    (完)

    iCC Develop Center 

  • 相关阅读:
    分布式git
    服务器上的git
    git分支
    剑指offer(38)二叉树的深度
    剑指offer(37)数字在排序数组中出现的次数。
    JS刷题总结
    剑指offer(36)两个链表中的第一个公共节点
    剑指offer(35)数组中的逆序对
    剑指offer(34)第一个只出现一次的字符
    剑指offer(33)丑数
  • 原文地址:https://www.cnblogs.com/0530z/p/3344225.html
Copyright © 2011-2022 走看看