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
  • 相关阅读:
    每天多一点之一个新的责任
    每天多一点之XML规则
    每天多一点之flush()
    Response.Redirect() 跳转中的ThreadAbortException
    IIS中的SSL Certificate 证书配置
    AD FS Setup Guide
    C#中静态方法和实例方法的使用
    SQL中的数据的批量操作
    页面JavaScript文件优化
    C#中的Equals、RefrenceEquals和==的区别
  • 原文地址:https://www.cnblogs.com/ccdev/p/2825355.html
Copyright © 2011-2022 走看看