电子商务网站建设任务分解,开一个网站多少钱,广州番禺网站制作公司,昆明做网站的公司哪家好单例模式在C中的实现方式有以下几种#xff1a;
懒汉式#xff08;线程不安全#xff09;饿汉式#xff08;线程安全#xff09;双检锁/双重校验锁#xff08;DCL#xff0c;线程安全#xff09;静态局部变量#xff08;线程安全#xff09;C11版本#xff08;线程…单例模式在C中的实现方式有以下几种
懒汉式线程不安全饿汉式线程安全双检锁/双重校验锁DCL线程安全静态局部变量线程安全C11版本线程安全
下面分别给出这五种实现方式的代码示例和解释。
懒汉式线程不安全
class Singleton {
public:static Singleton* getInstance() {if (instance nullptr) {instance new Singleton();}return instance;}private:Singleton() {}static Singleton* instance;
};Singleton* Singleton::instance nullptr;
解释这种方式是在第一次调用getInstance()方法时才创建实例但是这种方式在多线程环境下是不安全的可能会出现多个实例。
饿汉式线程安全)
class Singleton {
public:static Singleton* getInstance() {return instance;}private:Singleton() {}static Singleton* instance;
};Singleton* Singleton::instance new Singleton();
双检锁/双重校验锁DCL线程安全
#include mutexclass Singleton {
public:static Singleton* getInstance() {if (instance nullptr) {std::unique_lockstd::mutex lock(mutex);if (instance nullptr) {instance new Singleton();}}return instance;}private:Singleton() {}static Singleton* instance;static std::mutex mutex;
};Singleton* Singleton::instance nullptr;
std::mutex Singleton::mutex;
解释这种方式是在第一次检查实例是否为空时加锁再次检查实例是否为空时不加锁这样可以减少锁的开销提高性能。
静态局部变量线程安全
class Singleton {
public:static Singleton getInstance() {static Singleton instance;return instance;}private:Singleton() {}
};
解释这种方式利用了C11的特性将实例定义为静态局部变量这样在程序结束时会自动销毁实例避免了资源泄露。同时这种方式也是线程安全的。
C11版本线程安全)
#include mutexclass Singleton {
public:static Singleton getInstance() {std::call_once(initInstanceFlag, Singleton::initInstance);return *instance;}private:Singleton() {}static void initInstance() {instance new Singleton();}static Singleton* instance;static std::once_flag initInstanceFlag;
};Singleton* Singleton::instance nullptr;
std::once_flag Singleton::initInstanceFlag;解释这种方式利用了C11的std::call_once和std::once_flag来实现线程安全的单例模式确保只初始化一次实例。