問題展開限定一下范圍:如下函數(shù)定義中,static 聲明局部靜態(tài)變量,Logger 的實(shí)例創(chuàng)建過程、以及外部獲取 Logger 的這個實(shí)例的過程,是否是線程安全的?
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元江南做網(wǎng)站,已為上家服務(wù),為江南各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792Logger GetLogger() {
static Logger inst;
return inst;
}
參考 Stack Overflow 的回答:
c++ - Is local static variable initialization thread-safe in C++11? - Stack Overflow
從這里的回答來看,是線程安全的,從標(biāo)準(zhǔn)層面保證的局部靜態(tài)變量在第一次調(diào)用的時候,執(zhí)行初始化過程,并行執(zhí)行需要等待初始化完成。
那么這個初始化,我認(rèn)為就是類實(shí)例的構(gòu)建過程了。那么至少 Logger inst 的構(gòu)建過程是線程安全的,用來做單例模式的時候,也是保證了線程安全的。
示例一個以這種方式來寫的單例模式:
class Logger {
public:
static Logger* GetInsance() {
static Logger inst;
return &inst;
}
private:
Logger() {}
explicit Logger(const Logger&) = delete;
};
額外的,下面也提到了,不要在這個初始化過程中引入死鎖。
就個人建議,如果使用這種方式來寫代碼,那么就盡量減少這個實(shí)例的依賴項(xiàng),也盡量不要在這個過程中使用鎖,這樣代碼邏輯簡單,也不容易出錯。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧