2012-06-21 71 views

回答

3

如果你有設置進入多線程方案之前的載體,然後你只想讀矢量從多個線程,無需修改它,那麼它是線程安全的。你可以讀取即使是同一個元素同時從兩個以上的線程,只要確保沒有線程以任何方式修改矢量。將矢量及其所有元素視爲只讀。

但是,對於修改,標準庫中的容器都不是線程安全的。你需要自己實現同步。

C++ 11引入了很多synchronization primitives,所以如果你的編譯器支持,你可以使用它們。

+0

刪除我的downvote。我不會upvote,雖然這是一個複製品,所以它是更具建設性的直接OP到[其他問題](http://stackoverflow.com/questions/7455982/is-stl-vector-concurrent-read-線程安全),它有大量的參考。 –

+0

@JonathanWakely:我已經投票結束了,但我不會刪除我的答案,因爲它沒有任何傷害。 – Nawaz

+0

還有一個問題,如果另一個線程鎖定了一個互斥量來改變向量中的值,那麼其他線程只會讀取它們的給定點需要擔心什麼? – Whyrusleeping

1

你不會有問題(afaik),除非他們使用相同的元素。

但是,如果他們刪除了某些東西,或push_back東西等,這是一個壞主意。

爲了安全起見,請使用鎖。

+0

謝謝,無論如何我正在考慮使用鎖,我唯一的預留(就像是多線程新手一樣)是使用鎖的性能影響。 – Whyrusleeping

3

不需要。跨線程管理矢量類是不安全的,您需要使用某種同步機制(例如互斥鎖)來保護對實例的讀取/寫入訪問。

+0

正如托馬斯在上面提到的問題所述,如果事先設置好數據,並且所有線程都只讀*讀取,那麼它是安全的。 如果一個線程正在執行寫操作,並且沒有其他線程正在讀取該元素,它可能是安全的,但我不確定該標準有多嚴格保證它(由於存儲在同一個字中的元素的讀 - 修改 - 寫入問題)。 – bdow

+0

它保證它絕對,請參閱http://stackoverflow.com/a/11020907/981959 –

+0

@JonathanWakely:對於cx11標準這是真的,不是嗎? OP沒有明確提到這一點。但無論如何,很高興知道...... –

1

一般來說std :: vector不是線程安全的。但是你想要做的是安全的。如果你只是在多個線程中讀取矢量,這將起作用。如果每個線程只寫入它自己的偏移量,它也會工作。如果你開始做一些事情,比如在線程中調整向量的大小,或者多個線程想要寫入相同的偏移量,那絕對不會起作用。