您好,登錄后才能下訂單哦!
在 Linux C++ 多線程編程中,線程安全的單例模式可以通過以下方法實(shí)現(xiàn):
mutex
和 lock_guard
實(shí)現(xiàn)線程安全:#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initFlag, &Singleton::initSingleton);
return *instance;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static void initSingleton() {
instance = new Singleton();
}
static std::once_flag initFlag;
static Singleton* instance;
};
std::once_flag Singleton::initFlag;
Singleton* Singleton::instance = nullptr;
int main() {
Singleton& singleton = Singleton::getInstance();
return 0;
}
shared_mutex
和 shared_lock
實(shí)現(xiàn)線程安全的懶漢式單例模式:#include <iostream>
#include <memory>
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::shared_lock<std::shared_mutex> lock(mutex_);
if (!instance_) {
std::unique_lock<std::shared_mutex> uniqueLock(mutex_);
if (!instance_) {
instance_ = std::make_shared<Singleton>();
}
}
return *instance_;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static std::shared_mutex mutex_;
static std::shared_ptr<Singleton> instance_;
};
std::shared_mutex Singleton::mutex_;
std::shared_ptr<Singleton> Singleton::instance_ = nullptr;
int main() {
Singleton& singleton = Singleton::getInstance();
return 0;
}
這兩種方法都可以實(shí)現(xiàn)線程安全的單例模式。第一種方法(使用 call_once
)適用于立即初始化的單例,而第二種方法(使用 shared_mutex
和 shared_lock
)適用于懶漢式單例,即在第一次使用時(shí)才初始化。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。