簡體   English   中英

在沒有同步機制的情況下,由不同線程同時讀取單個c ++ std :: map對象是否安全?

[英]Is it safe to read a single c++ std::map object by different threads simultaneously without synchronization mechanisms?

我有一個全局對象,其中包含幾個c ++ std :: map對象。 該對象應該在多線程環境中是只讀的。 但是我不確定在std :: map的實現中讀取C ++ std :: map對象時是否有任何寫操作。 IDE是Visual Studio2008。我應該為讀取操作提供一些同步機制嗎?

是的,只要沒有人在寫地圖,就可以了。 詳細信息請參見此處。

std :: map的線程安全性,用於只讀操作

至少存在一個“便攜式”問題,如果您使用operator[]進行讀取,則不一定是只讀操作,因為如果該項目在地圖中尚不存在,則會創建該項目。 除此之外,這還取決於具體的實現方式。

如果使用下標運算符,則不會。 下標運算符(map [1])可能會改變地圖的結構。

但是,如果將find方法與const_iterators一起使用,則是安全的。 只要記住,如果更改了映射,所有這些迭代器都可能變得無效。

話雖如此,這可能仍然是一個不安全的想法。

有關VC ++ 2008附帶的std庫的詳細信息,請參見此處

單個對象是線程安全的,可以從多個線程讀取。 例如,給定對象A,可以安全地從線程1和線程2讀取A。

關於std容器的線程安全性沒有任何規則,這取決於庫開發人員。 因此,請始終檢查特定std實現的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM