線程安全的對象生命期管理
阿新 • • 發佈:2018-04-29
stat 管理 這一 c++ 加載 cal 模式 構造順序 mov
線程安全的對象生命期管理
解決對象構造的線程安全
- 當我們需要動態分配對象時( 懶加載 ), 如果在多個線程中運行這一部分代碼,可能出現多次初始化的問題。
單例模式
c++ 11 之後static 變量的初始化是線程安全的。可以利用靜態變量來實現單例模式,解決重復初始化的問題。
std::call_once
個人感覺不夠優美,要傳遞一個flag 來標識初始化情況
線程訪問未初始化的資源
比如在Thread類中,std::thread被構造之後立即開始執行線程中函數,然而函數中訪問的資源可能還沒有被初始化。
解決方案:
- 成員初始化列表控制構造順序
- 手動控制線程函數的運行
- 不要泄露this指針
解決對象析構的線程安全
- 對象的析構問題是一個比較特別的線程安全問題,在我們析構這個對象的時候如何得知有沒有其他線程在使用它?在我們使用這個對象的時候又如何保證它沒有被析構(成為野指針)?
解決方案
使用shared_ptr 和 unique_ptr 控制生命周期,使用自定義的析構函數來提供適配性。
使用weak_ptr 探測shared_ptr的生命周期, 避免環狀引用
註意
shared_ptr 的引用計數是安全無鎖的,然而它本身需要加鎖(有兩個指針,內部是二段式操作)。
使用shared_from_this
對獨有的資源使用std::move + std::unique_ptr
線程安全的對象生命期管理