1. 程式人生 > >線程安全的對象生命期管理

線程安全的對象生命期管理

stat 管理 這一 c++ 加載 cal 模式 構造順序 mov

線程安全的對象生命期管理

解決對象構造的線程安全

  • 當我們需要動態分配對象時( 懶加載 ), 如果在多個線程中運行這一部分代碼,可能出現多次初始化的問題。

單例模式

c++ 11 之後static 變量的初始化是線程安全的。可以利用靜態變量來實現單例模式,解決重復初始化的問題。

std::call_once

個人感覺不夠優美,要傳遞一個flag 來標識初始化情況

線程訪問未初始化的資源

比如在Thread類中,std::thread被構造之後立即開始執行線程中函數,然而函數中訪問的資源可能還沒有被初始化。
解決方案:

  1. 成員初始化列表控制構造順序
  2. 手動控制線程函數的運行
  3. 不要泄露this指針

解決對象析構的線程安全

  • 對象的析構問題是一個比較特別的線程安全問題,在我們析構這個對象的時候如何得知有沒有其他線程在使用它?在我們使用這個對象的時候又如何保證它沒有被析構(成為野指針)?

解決方案

使用shared_ptr 和 unique_ptr 控制生命周期,使用自定義的析構函數來提供適配性。
使用weak_ptr 探測shared_ptr的生命周期, 避免環狀引用

註意

shared_ptr 的引用計數是安全無鎖的,然而它本身需要加鎖(有兩個指針,內部是二段式操作)。
使用shared_from_this
對獨有的資源使用std::move + std::unique_ptr

線程安全的對象生命期管理