考慮到線程安全的雙重檢查鎖定(對於單例或惰性初始化),我已經閱讀了很多問題。在一些線程中,答案是模式完全被破壞,另一些則提出瞭解決方案。C++ 11:用於延遲初始化的安全雙重檢查鎖定。可能?
所以我的問題是:有沒有辦法在C++中編寫完全線程安全的雙重檢查鎖定模式?如果是這樣,它是怎樣的。
我們可以假設C++ 11,如果這樣做更容易。據我所知,C++ 11改進了內存模型,可以產生所需的改進。
我知道在Java中可以通過使用雙重檢查保護變量volatile。由於C++ 11從Java中借用了大部分內存模型,所以我認爲這可能是可能的,但是如何呢?
如果您可以使用C++ 11,則忽略整個雙重檢查的鎖定業務並使用靜態局部變量或'std :: call_once'。 –
靜態本地人是懶惰初始化?關於'call_once':如何確保一次調用不會將未完全創建的引用寫入變量? – gexicide
是的,靜態locals是以線程安全的方式懶惰地初始化的。 'call_once'確保主題只被調用過一次;並且在實際執行該函數的那個函數返回之前,沒有其他調用'call_once'返回(您可以在http://en.cppreference.com/w/cpp/thread/call_once處閱讀更多內容)。它如何做到這一點取決於實施。這兩件事基本上存在,所以你不想再寫更多的
錯誤雙重檢查鎖定實現。 –