我有一個boost::shared_ptr<Map>
,並且這個映射正在被多個線程修改,我需要使用顯式互斥還是線程正在通過共享指針修改映射的事實,我會得到某種隱含的線程安全性?存儲在共享指針中的對象的線程安全
回答
Did you even look at the docs?
shared_ptr對象提供線程安全的同一級別的內置 類型。一個shared_ptr實例可以被多個線程同時「讀取」(僅使用const 操作訪問)。不同的shared_ptr 實例可以被「寫入」 simultaneosly由多個線程(使用可變操作,例如 如操作者訪問=或復位)(即使當 這些實例是副本,並共享下方相同的參考計數 。)
任何其他同時訪問都會導致未定義的行爲。
編輯:它看起來像你問的是指向的對象,而不是指針本身。在這種情況下,根本沒有線程安全高管。爲什麼會有?
如果您正在讀取的指針有可能發生變化,那麼讀取它並不安全,遠不及常規指針。常規指針是一個單詞,共享指針是指向該對象的指針和指向計數的單獨指針。因此從任何架構上讀取它都不是固有的原子。因此,一個問題是你可以讀取一個值和一個不匹配的計數器......另一個問題是,如果共享指針改變了,那麼可能會在另一個線程通過讀取它的方式刪除該對象。 ref-count的增量可能會損壞。 –
shared_ptr
與內置類型具有相同的線程安全級別。
您可以同時從多個線程執行讀取(常量)操作。
您還可以在不同的shared_ptr
實例中同時執行來自多個線程的寫操作(即使用可變操作,例如operator=
或reset
)。這包括這些實例共享相同引用計數的情況(因爲shared_ptr
爲ref計數器提供了原子增量/減量)。
如果您需要任何其他類型的訪問權限,您需要同步它,否則您將得到未定義的行爲。
- 1. 共享庫(dlopen)和庫靜態指針的線程安全性
- 2. 存儲在線程安全集合線程中的對象是否安全?
- 3. C++ 11共享指針線程安全性是否被破壞?
- 4. 將共享指針存儲矢量對象拋出錯誤?
- 5. 線程安全訪問對象之間共享的數據
- 6. 複製包含共享指針列表的共享指針後面的對象
- 7. 創建將共享指針作爲參數的對象的共享指針
- 8. Flash共享對象(cookie) - 安全地存儲密碼?
- 9. Ç共享存儲器指針映射
- 10. 提升共享內存對象中的指針
- 11. 線程安全共享對象到期和重新初始化
- 12. 大對象數組在多個線程之間共享。線程安全技術
- 13. 如何將對象共享指針指向其他線程佔用的位置?
- 14. C++:創建一個共享的對象,而不是共享的對象指針
- 15. 通過共享內存共享指針
- 16. 共享對象和線程
- 17. 線程之間共享指針嗎?
- 18. 在多線程應用程序中安全地卸載DLL /共享對象
- 19. 指針數組,共享對象
- 20. 將對象的指針直接存儲在指針向量中?
- 21. 共享指針:指針的指針
- 22. 共享內存中的指針
- 23. 指針和共享內存
- 24. 如何區分指向共享和全局內存的指針?
- 25. 不同線程共享的對象
- 26. 線程之間的CUDA共享對象
- 27. 存儲向量中的數組共享指針
- 28. 在線程之間共享對象
- 29. 在線程之間共享XPObject對象
- 30. 存儲在sessionScope中的對象應該是線程安全的嗎?
編號'shared_ptr'絕對不會爲線程安全做任何事情。它所做的只是爲動態分配的對象提供引用計數語義。 –
你的問題的簡短答案是「否」。 'shared_ptr'提供的線程安全只適用於指針本身。它沒有做任何事來保護對象本身。一旦你從'shared_ptr'結構中得到一個指向底層對象的指針,你就不會再有魔法了。 –
@DavidSchwartz我總是通過間接訪問對象到shared_ptr,而不是通過原始指針。這將提供線程安全嗎? – Jimm