簡體   English   中英

是<vector>線程安全的讀/寫在不同的位置?

[英]is < vector > threadsafe for read/write at different locations?

這是一個初學者的問題,我猜,但我找不到這個特定問題的答案:

我有一個大小為10的標准(c ++)向量v並且類型為int。

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

所以,在這2個線程的生命周期內,不改變大小,沒有push_back()等。

如果它不安全,使用數組會更好嗎?

謝謝你的幫助。

vector不提供任何線程安全保證,因此從技術上講,答案是否定的。

在實踐中,你應該能夠僥幸逃脫......直到有人(可能是你)在程序的一個角落做出一點改變並且所有地獄都破裂的那一天。 在任何非平凡的計划中,我都不會感到很自在。

來自MSDN: 標准C ++庫中的線程安全

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

  • 從一個線程一次沒有其他線程上的編寫器。
  • 從其他線程上沒有編寫器的許多線程。

對於對同一對象的寫入,當沒有其他線程上的讀取器時,該對象對於從一個線程寫入是線程安全的

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

  • 從一個線程一次。
  • 從一個線程一次沒有其他線程上的編寫器。
  • 一次從許多線程。
  • 從其他線程上沒有編寫器的許多線程。

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

  • 從一個線程,當沒有其他線程的讀者。
  • 來自許多線程。

所以從上面來看理論上,不,它不會是線程安全的

理論上:沒有。

實際上:是(根據所有眾所周知的STL的實施方式)

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

編譯器和處理器都可能重新排序指令,即使上述內容不適用,也可能會破壞程序。 這就是C ++ 0x具有內存模型的原因。

您描述的場景將是安全的 - 您可以有效地操縱固定大小數組的各個元素(因為vector大小在這些操作期間不會改變),因此除非您操縱任何元素,否則您首先不需要任何其他同步來自多個線程(不是你的情況)。

暫無
暫無

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

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