C 中經常爭論的一個問題是局部靜態變數初始化的執行緒安全性,例如以下程式碼:
Logger& g_logger() { static Logger lg; return lg; }
在C 11在標準中,此類初始化的行為已經最終確定,現在保證它是線程安全的。標準第 6.7 節規定“此類變數在控制第一次通過其聲明時被初始化”,並且“並發執行應等待初始化完成”。此外,實作腳註澄清了「實作不得在初始化程式的執行周圍引入任何死鎖。」
主要編譯器(gcc 4.7、vc 2011 和clang 3.0)已正確實作修訂後的線程安全要求。這意味著即使存在並發線程,lg 變數的建構子只會執行一次。
請注意,此保證僅適用於初始化本身。後續透過引用訪問變數不一定是線程安全的。
以上是C 11 局部靜態變數初始化保證線程安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!