[英]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.