3 回答

TA貢獻1842條經驗 獲得超22個贊
C ++標準為標準C ++庫中的所有類提供了一定的線程保證。這些保證可能不是您期望的那樣,但是對于所有標準C ++庫類,都會做出某些線程安全保證。但是,請確保您已閱讀保證書,因為標準C ++容器的線程保證書通常與您希望它們成為的東西不一致。對于某些不同的類(通常更強),可以做出保證,以下答案特別適用于容器。容器本質上具有以下線程安全保證:
同一容器中可以有多個并發讀取器
如果只有一位作家,就不會有更多的作家,也沒有讀者
這些通常不是人們所希望的線程安全保證,而是在標準容器的接口下非常合理的:它們旨在在沒有多個訪問線程的情況下有效地使用。為他們的方法添加任何形式的鎖定都會對此產生干擾。除此之外,容器的接口對于任何形式的內部鎖定都不是真正有用的:通常使用多種方法,并且訪問取決于先前訪問的結果。例如,在檢查容器不是empty()一個元素之后,可以訪問它。但是,使用內部鎖定不能保證在實際訪問該對象時該對象仍在容器中。
為了滿足提供上述保證的要求,您可能必須對并發訪問的容器使用某種形式的外部鎖定。我不知道boost容器,但是如果它們具有與標準容器相似的接口,我會懷疑它們具有完全相同的保證。
保證和要求在17.6.4.10 [關于對象]第1段中給出:
如果從不同線程對標準庫函數的調用可能導致數據爭用,則程序的行為是不確定的。17.6.5.9中指定了發生這種情況的條件。[注意:修改線程之間共享的標準庫類型的對象可能會導致不確定的行為,除非該類型的對象被明確指定為可共享的,而沒有數據爭用或用戶提供了鎖定機制。--endnote]
...和17.6.5.9 [res.on.data.races]。本節從本質上詳細介紹了非正式的描述。

TA貢獻1794條經驗 獲得超8個贊
我有多個線程同時在std :: vector的共享對象上調用push_back()。std :: vector線程安全嗎?
這是不安全的。
還是我需要自己實現該機制以使其線程安全?
是。
我想避免做額外的“鎖定和釋放”工作,因為我是圖書館用戶而不是圖書館設計師。我希望尋找現有的矢量線程安全解決方案。
好吧,vector的接口并不是并發使用的最佳選擇。如果客戶端可以訪問鎖,但是對于接口來說,它可以抽象出每個操作的鎖,那就可以了。實際上,如果沒有外部鎖,vector的接口就不能保證線程安全(假設您需要的操作也會發生變化)。
從boost 1.48.0開始新引入的boost :: vector怎么樣。它是線程安全的嗎?
文件狀態:
//! boost::container::vector is similar to std::vector but it's compatible
//! with shared memory and memory mapped files.

TA貢獻1843條經驗 獲得超7個贊
我有多個線程同時在std :: vector的共享對象上調用push_back()。...我希望尋找向量的現有線程安全解決方案。
看看concurrent_vector在英特爾TBB。嚴格來說,它與std::vector內部有很大不同,并且與API并不完全兼容,但仍然可能合適。您可以在TBB開發人員的博客中找到有關其設計和功能的詳細信息。
- 3 回答
- 0 關注
- 2818 瀏覽
添加回答
舉報