簡體   English   中英

std :: map和std :: vector線程安全嗎?

[英]Are std::map and std::vector thread safe?

我正在開發一個多線程應用程序,每個線程都將從一組映射和向量中讀取(不會對結構進行修改)。 誰能提出建議,因為線程僅從這些結構中讀取,是否有必要在讀取這些結構的代碼塊周圍實現可共享的互斥鎖?

在只讀映射/矢量的情況下,無需使用互斥體。 向量地圖都已經回答了
雖然C ++ 03沒有提到線程,但C ++ 11的子句涵蓋了您的問題。

23.2.2容器數據競賽[container.requirements.dataraces]

1為了避免數據爭用(17.6.5.9),實現應將以下函數視為const:begin,end,rbegin,rend,front,back,data,find,lower_bound,upper_bound,equal_range,at和,除非在關聯或無序關聯容器,operator []。
2盡管有(17.6.5.9),當同時修改了除了vector<bool>之外的相同序列中不同元素中所包含對象的內容時,仍需要實現以避免數據爭用。
3 [注意:對於大小大於1的vector<int> x,x [1] = 5和* x.begin()= 10可以在沒有數據爭用的情況下同時執行,但是x [0] = 5和* x.begin()= 10同時執行可能會導致數據爭用。 作為一般規則的一個例外,對於向量<bool> y,y [0] = true可能與y [1] = true競爭。 —尾注]

因此,在C ++ 11中,不僅允許讀取對象,而且允許並發修改其不同的對象(但不允許容器!),但vector <bool>例外。

暫無
暫無

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

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