2013-05-13 66 views
2

我想知道,是不是安全的假設,如果將多個線程訪問單個靜態容器(升壓:: unordered_map)沒有必要的訪問鎖定到容器鎖定,如果多個線程只是從中讀取數據。沒有書寫時你需要只有在閱讀

回答

7

當多個線程只是讀取並執行沒有寫操作時,你並不需要同步訪問。

段落的C++ 11標準的1.10限定了相對於數據爭用衝突操作爲:

兩個表達評價衝突如果它們中的一個修改的存儲器位置(1.7),而另一個存取 或修改相同的內存位置。

然後當然,每1.10/21:

一個程序的執行包含數據爭,如果它包含在不同的線程兩個相互矛盾的操作,其中 的至少一個是不是原子的,也不是在另一個之前發生的。 [...]

+0

是額外,額外的安全,你可能要初始化靜態容器後做了屏蔽操作。 – 2013-05-13 19:47:14

+0

還要確保「讀」不改變容器的內部狀態(而unordered_map和大多數人很可能不這樣做一個專門的容器可能會修改內部緩存或元素的順序,以優化頻繁使用的物品的查找) – josefx 2013-05-13 19:58:11

+2

@josefx:如果是這樣,我希望由容器本身同步。由於C++ 11,'與標準庫類型中使用的上庫對象和對象const'操作必須是線程安全(見[此](http://channel9.msdn.com/posts/C-and-Beyond-2012 -Herb - 薩特 - 你 - 不要 - 知識空白和空白))。由於'boost :: unordered_map'啓發了'std :: unorderded_map',如果不是這樣的話,我會很驚訝 – 2013-05-13 20:00:50