std::shared_ptr 的線程安全
您從 MSDN 引用的有關 std::shared_ptr 線程安全的聲明可能會被誤解。這表示雖然多個執行緒可以同時讀寫不同的shared_ptr對象,但這並不能保證修改shared_ptr物件本身的安全性。
TL;DR:
std::shared_ptr 的線程安全僅適用於指向同一底層物件的多個指標的管理。它不會擴展到共享物件的內容或對shared_ptr實例的並發寫入。
詳細說明:
shared_ptr內部由兩個元件組成:
範例:
在您的程式碼片段中,global 是指向設定物件的共用指標。執行緒 1 將 global 複製到它自己的共用指標 private 中。如果執行緒 2 隨後修改 global,private 仍將指向原始設定對象,因為控制塊未修改。然而,如果線程2將新的配置物件分配給全局,則私有將仍然指向原始物件。
指向物件的線程安全性:
安全地進行操作的能力透過多個執行緒修改指向的物件取決於物件的實作。對於您的配置類,如果它允許並發寫入而無需同步,例如添加或刪除設置,則程式碼將不是線程安全的。
解決方案:
為了確保物件修改的執行緒安全,請使用std::mutex等同步機制來保護對shared_ptr物件或共享物件本身的存取。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3