首頁 >後端開發 >C++ >std::shared_ptr 真的是線程安全的嗎?

std::shared_ptr 真的是線程安全的嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-17 03:44:03550瀏覽

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

std::shared_ptr 的線程安全

您從 MSDN 引用的有關 std::shared_ptr 線程安全的聲明可能會被誤解。這表示雖然多個執行緒可以同時讀寫不同的shared_ptr對象,但這並不能保證修改shared_ptr物件本身的安全性。

TL;DR:

std::shared_ptr 的線程安全僅適用於指向同一底層物件的多個指標的管理。它不會擴展到共享物件的內容或對shared_ptr實例的並發寫入。

詳細說明:

shared_ptr內部由兩個元件組成:

  • 控制區塊:管理shared_ptr的引用計數並確保正確銷毀所指向的對象。該元件是線程安全的。
  • Pointed Object:被共享的實際資料結構或物件。該物件的線程安全性取決於其實作。

範例:

在您的程式碼片段中,global 是指向設定物件的共用指標。執行緒 1 將 global 複製到它自己的共用指標 private 中。如果執行緒 2 隨後修改 global,private 仍將指向原始設定對象,因為控制塊未修改。但是,如果執行緒 2 將新的設定物件指派給全域,則 private 仍將指向原始物件。

指向物件的執行緒安全性:

安全地進行操作的能力透過多個執行緒修改指向的物件取決於物件的實作。對於您的配置類,如果它允許並發寫入而不同步,例如添加或刪除設置,則程式碼將不是線程安全的。

解決方案:

為了確保物件修改的執行緒安全,請使用std::mutex等同步機制來保護對shared_ptr物件或共享物件本身的存取。

以上是std::shared_ptr 真的是線程安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn