双重检查锁(DCLP)
- 通过 std::mutex 保证线程安全
- 双重检查减少了锁的开销,只有第一次创建时才会加锁
#include <iostream>
#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {std::cout << "Constructor called\n";}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) { std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) { instance = new Singleton();}}return instance;}void show() {std::cout << "Singleton instance address: " << this << "\n";}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;int main() {Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();s1->show();s2->show();return 0;
}
静态局部变量
- C++11 标准保证静态局部变量的初始化是线程安全的
- 不需要手动加锁
#include <iostream>class Singleton {
private:Singleton() {std::cout << "Constructor called\n";}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {static Singleton instance; return instance;}void show() {std::cout << "Singleton instance address: " << this << "\n";}
};int main() {Singleton& s1 = Singleton::getInstance();Singleton& s2 = Singleton::getInstance();s1.show();s2.show();return 0;
}