C++设计模式---单例模式

适用于单线程的单例模式

Singleton.h

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

class Singleton
{
public:
    static Singleton* GetInstance();

private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
};

#endif

Singleton.cpp

#include "Singleton.h"

Singleton* Singleton::GetInstance()
{
    static Singleton s_instance;
    return &s_instance;
}

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

C++0x以后,要求编译器保证内部静态变量的线程安全性,所以,在此种情况下,以上单例模式也是线程安全的。

线程安全的单例模式

以下利用boost库实现线程安全的单例模式。
完全参照以下这篇文章:
http://www.gocalf.com/blog/cpp-singleton.html
Singleton.h

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

class Singleton
{
public:
    static Singleton* GetInstance();

private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);

    static Singleton* s_instance;
};

#endif

Singleton.cpp

#include "Singleton.h"
#include <boost\thread.hpp>

Singleton* Singleton::s_instance = 0;

Singleton* Singleton::GetInstance()
{
 static boost::mutex s_mutex;
    if (0 == s_instance)
    {
 boost::mutex::scoped_lock lock(s_mutex);
        if (0 == s_instance)
        {
            s_instance = new Singleton();
        }
    }

    return s_instance;
}

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

线程安全的单例模式使用了double-checked locking pattern (DCLP) 机制。其实,该机制也有失效的时候,并不是百分百保险。但是一般情况下使用是足够了。
关于DCLP,具体可以参看以下两篇文章:
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/
没想到一个貌似简简单单的线程安全单例模式竟然会有如此深奥的问题。

你可能感兴趣的:(设计模式,C++,Singleton)