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

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

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

    需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的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 const 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
  • 相关阅读:
    MP3/4维修全攻略
    看图学维修mp3之电源篇65Z8\65Z5
    CSS按钮样式之button标签与input type=button的区别详解
    【原】PNG的使用技巧
    【原】[webkit移动开发笔记]之禁止触发系统默认菜单
    【原】使用iScroll.js解决ios4下不支持position:fixed的问题
    【原】YUI压缩与CSS media queries下的bug
    【翻译】Building a Simple Blog Engine with ASP.NET MVC and LINQ Part 2
    【翻译】Building a Simple Blog Engine with ASP.NET MVC and LINQ Part 4
    .NET技术书籍推荐
  • 原文地址:https://www.cnblogs.com/ccdev/p/2825355.html
Copyright © 2011-2022 走看看