1.當析構函式遇到多執行緒
①在即將析構乙個物件時,別的執行緒是否正在執行該物件的成員函式?
②如何保證在執行成員函式期間,物件不在另乙個執行緒被析構?
③在呼叫某個成員函式之前,如何確保物件還活著?析構函式會不會執行到一半?
1.1執行緒安全類
①多個執行緒同時訪問,表現出正確的行為
②無論作業系統如何排程這些執行緒,無論這些執行緒執行順序如何交織
③呼叫端**無需額外的同步
鎖一般是棧上物件,只需要臨界區加鎖即可,解鎖正好等於其作用域
物件構造要執行緒安全,唯一要求在構造期間不要洩露指標(建構函式執行期間物件還沒有完成初始化,如果洩露給其它物件,顯而易見可能會更改)
1.2作為資料成員的mutexlock只能同步保護class其它資料成員的讀寫,不能保證安全析構,因為mutexlock成員生命期最多與物件一樣長,而析構可能發生在物件釋放之後
1.3判斷乙個指標是不是合法指標沒有高效的辦法,這是c/c++指標問題的根源
物件的關係主要有三種:composition、aggregation、association
1.composition:物件x的生命期由其owner控制,x是owner的直接資料成員,或者是owner持有的容器元素
2.association 、aggregation:a持有b的指標或引用,但是b的生命期不由a控制
c++可能出現的記憶體問題:
①緩衝區溢位
②空懸指標/野指標
③重複釋放
④記憶體洩漏
⑤不配的new/delete
⑥記憶體碎片
用流水線、生產者消費者,任務佇列這些有規律的機制,最低限度共享資料,是多執行緒程式設計最好的建議
1.原始指標暴露給多個執行緒會造成race condition
2.統一使用shared_ptr/scoped_ptr管理生命期,在多執行緒中尤其重要
3.shared_ptr是值語意,當心意外延遲物件生命期
4.weak_ptr可以用作若**、物件池
muduo 執行緒安全的物件生命期管理
六 系統地避免各種指標錯誤 七 shared ptr 技術與陷阱 八 小結 當乙個物件能被多個執行緒同時看到時,那麼物件的銷毀時機就會變得模糊不清,可能出現多種競態條件 race condition 解決這些race condition是 c 多執行緒程式設計面臨的基本問題。本文試圖以shared ...
執行緒安全的物件生命期管理(三)
c 裡可能出現的記憶體問題大致有這麼幾個方面 1 緩衝區溢位 2 空懸指標 野指標 3 重複釋放 4 記憶體洩漏 5 不配對的new delete 6 記憶體碎片 正確使用智慧型指標能很容易地解決前面5個問題。1 緩衝區溢位 用vector string或自己編寫buffer class來管理緩衝區...
執行緒安全的物件生命期管理(七)
物件池 舉例 class stockfactory boost noncopyable 這段 中有乙個問題,stock物件永遠不會被銷毀,因為map裡存的是shared ptr,那就改為weak ptr class stockfactory boost noncopyable shared ptrs...