Effective C 條款04中有關local static物件的reference returning函式的疑問?

時間 2021-06-12 23:54:36

1樓:嚴偉

請使用C++11/14

函式內static變數現在已經執行緒安全了。。。。

為了解決這個方法中的多執行緒問題,執行緒庫一般會提供對應的解決方案,如PTHREAD_ONCE_INIT,BOOST_ONCE_INIT,

同時,在這個方法中為了長遠的避免多執行緒問題,也可以使用thread_local型別的資料來為每乙個使用該函式的執行緒單獨初始化乙個執行緒獨有資源,以避免多執行緒訪問衝突,但這個需要邏輯上允許

2樓:Fengyang Gao

不會分配多個,只不過有可能會對同乙個local static構造多次。兩個執行緒,如果同時呼叫這個包含local static物件的函式,它們都會認為這個物件還沒有被構造過,所以會構造兩次。

Effective C++裡說的手動呼叫一次函式,只是保證初始化只進行一次,並不能保證之後沒有問題。比如

int&

foo()

兩個執行緒如果同時呼叫foo()+=100,可能乙個執行緒在執行foo()+100,還沒有把結果賦值給foo(),另乙個執行緒又執行了,最後導致了static int x只增加了100,而不是200。這就是Race condition,題主可以看看多執行緒的同步方面的知識,在此就不加贅述了。

Effective C++裡描述的問題的根源不是這個函式的問題,而是non-const static物件(全域性或者區域性)本身在多執行緒裡會出現的問題,而書中的手動呼叫方式,解決的也只是初始化時的race condition。non-const static物件的race condition可以通過訊號量等方法來解決,但是正如書中所說,除非必要,讓乙個執行緒等待另乙個執行緒完成操作不是乙個好主意。

Apache2 協議中的專利條款和 Facebook 的 BSD 協議附加的專利條款有什麼本質區別?

bo zhang Apache2 協議中的專利條款是被限制在專案本身涉及的技術和專利中。Facebook 的專利條款擴大到了任何技術 形式和範圍的專利訴訟中。用了Facebook的RN技術之後,如果對Facebook及其關聯公司的提出任何技術相關的 不限制在RN技術 專利訴訟,RN的授權都會撤回。這...

重疾險中的三同條款很重要麼?

十四先生聊保險 有兩種 第一種是 三同條款 第二種是三同條款的衍生問題。第一種 三同條款 若被保險人因同一疾病原因 同次醫療行為或同次意外傷害事故導致初次患上本合同所列的兩種或兩種以上重大疾病 中症 輕症,我們僅按一種重大疾病 中症 輕症給付重大疾病 中症 輕症保險金。如果某產品沒有三同條款的限制,...

想買0 4歲的安全座椅,在品牌型號中糾結,求指點。

小泡芙生活即 說說六款座椅各自配置優點吧 NUNA REBL plus 1 可360 旋轉,上下車方便 2 單手7段式靠背調整,可以適應不同年齡段的孩子3 通風透氣較好 4 自帶伸縮式支撐腿,增加穩固性 寶得適雙面騎士 1 可雙向安裝,360 旋轉 2 自帶伸縮式支撐腿,增加穩固性 3 可調四檔位,...