在C++中實現多線程安全的單例類通常使用雙檢鎖機制(Double-Checked Locking Pattern)來確保只有一個實例被創建。下面是一個使用雙檢鎖機制實現多線程安全的單例類的示例代碼:
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* instance;
static std::mutex mutex;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
int main() {
Singleton* singleton1 = Singleton::getInstance();
Singleton* singleton2 = Singleton::getInstance();
std::cout << "singleton1 address: " << singleton1 << std::endl;
std::cout << "singleton2 address: " << singleton2 << std::endl;
return 0;
}
在上面的示例中,getInstance
函數使用雙檢鎖機制,在第一次調用時檢查instance
是否為nullptr
,如果是,則使用std::lock_guard<std::mutex>
對mutex
進行加鎖,然后再次檢查instance
是否為nullptr
,如果是,則創建一個新的Singleton
實例。這樣可以確保在多線程環境下只有一個實例被創建。
需要注意的是,C++11及以上的標準庫中提供了std::call_once
和std::once_flag
可以更方便地實現單例模式,可以參考這篇文章:C++11單例模式的線程安全實現。