2011-06-23 210 views
12

這是一個初學者問題,我猜但我找不到這個問題的答案:是< vector >線程安全在不同地點讀/寫?

我有一個標準的(c + +)向量v大小爲10,類型爲int。

是否安全有一個線程改變所有偶數位置(v.at(0)= x; v.at(2)= y;等等) 和另一個線程修改奇數位置的所有值(v.at(1)= a; v.at(3)= b;等等)?

所以,在這兩個線程的生命週期內,不改變大小,不需要push_back()等等。

如果它不安全,使用數組是否會成爲更好的方法?

感謝您的幫助。

回答

10

vector不提供任何線程安全保證,所以在技術上的答案是否定的。

在實踐中,你應該能夠用它獲得了......直到有一天,有人(可能是你),使該計劃的一個角落,所有的地獄破散小的變化。在任何非平凡的計劃中做這件事我都不會感到舒服。

+1

+1試圖避免不眠之夜這個應用程序交付後,更糟的是,增強/維持:( –

+0

謝謝您的回答,我看到你的意思... 雖然: 你會如何接近?問題的想法是變量的相當大的網格劃分成部分共享的計算時間對整個電網的鎖定/矢量會慢下來的東西相當多的 –

+2

@Benthebear:也許從對面...產生部分網格,獨立處理每個部分而不鎖定,並最終合併結果。可以這樣做嗎? – Jon

4

您描述的場景將是踏面安全的 - 您可以有效地操作固定尺寸陣列的各個元素(因爲vector尺寸在這些操作過程中不會改變),所以除非您首先不需要任何額外的同步你操縱多個線程中的任何元素(這不是你的情況)。

7

從MSDN:Thread Safety in the Standard C++ Library

對於讀取同一個對象,該對象是線程安全的閱讀:

  • 從一個線程的時候,其他線程上沒有作家。
  • 從許多線程一次沒有其他線程上的作家。

對於寫入同一個對象,該對象是線程安全的從一個線程寫入時對其他線程

對於讀取同一類的不同對象沒有讀者,對象是線程安全的閱讀:

  • 從一次一個線程。
  • 從一個線程一次沒有其他線程上的作家。
  • 來自多個主題。
  • 從許多線程一次沒有其他線程上的作家。

對於寫入同一類的不同對象,該對象是線程安全的寫作:

  • 從一個線程時在其他線程沒有讀者。
  • 來自多個主題。

所以從以上,Theorotically,NO,它不會是線程安全的

4

理論上:沒有。

實際上:是(根據多麼所有知名補充交易實現)

5

它是依賴於機器。如果你有一個vector<char>處理器可能無法在單獨的單詞加載v [I]和v [I + 1]。您可能有緩存一致性問題。

編譯器和處理器可能重新排序的指令,這可以打破即使上面不適用你的程序。 This is why C++0x has a memory model.

相關問題