2017-08-16 135 views
5

我想知道兩個線程是否可以修改相同數組的元素。兩個線程可以寫入同一個數組的不同元素嗎?

如果我已經unsigned char array[4],可以設置線程1和array[0]array[1]「A」及線程在沒有問題同時設置array[2]array[3]至「B」?

+1

總是可以通過多個線程修改相同的*絕對*內存位置。 – JosephDoggie

+0

由於你沒有設置任何相同的地址空間,我不認爲你會遇到任何多線程問題。 – user3400223

+0

這取決於體系結構。你在用什麼處理器? – templatetypedef

回答

2

根據定義,當1個或多個線程將數據寫入到相同的位置在存儲器中,而其他從中讀取(競爭狀態發生或寫信給它)。每個修改不同數組元素的多個線程是否正在寫入內存中的相同位置?答案是不。每個數組元素都有一個內存區域,這個區域在屬於整個數組的區域內單獨保留。因此,不同元素的修改不會寫入任何相同的存儲位置。

其實這個問題我問一個很長的時間以前here,並在我的博士研究的基礎部分。我並行地安裝了數百條曲線(最小二乘擬合),同時更新了由多個線程產生結果的單個數組。

+1

根據標準的「數據競爭」定義,對同一位置的多次寫入可以自行產生數據競爭,而不會有任何併發​​讀取器。除此之外,雖然我認爲這個答案在提出的問題上是正確的,但它的措辭非常混亂。也許你的意思是說「[*] *單個數組的不同元素」? –

+0

@JohnBollinger你說得對。不過,我認爲寫作比閱讀要求更高,這就是爲什麼如果閱讀導致一場比賽,那麼肯定寫作也是如此(我改正/改進了我的答案)。我無法理解你的建議。請提出編輯,我會修改我的答案。 –

+0

我已經做了我建議的編輯。通過一切手段進一步編輯或恢復,如果你不喜歡它。我起初很猶豫,因爲這是一個相當大的變化,但出於同樣的原因,我不知道如何更緊湊地提出這樣的編輯,因爲我的第一次嘗試沒有充分表達我的意圖。 –

1

在我遇到的所有系統上,將不同線程寫入同一陣列的不同元素並不是一個功能問題。在某些系統上,由於不同內核上的線程訪問同一緩存行中的數據,可能會導致性能問題。硬件將解決功能部分,但性能可能不好。

功能問題並沒有啓動,直到你想一個線程讀取由另一個線程寫入的數據。那時你需要一個機制(例如互斥鎖,信號量,原子操作等)來確保寫入的數據對所有其他線程都是可見的。

1

如果線程在同一內核上執行這將是一個串行寫流程中,您將設置不同的字節,正如「線性」會在一個線程代碼。但是,您不一定知道按照什麼順序(在正常情況下)。意思是按什麼順序執行的線程。

然而,如果寫入從兩個不同的核的高速緩存線將被標記的各核的高速緩存和寫操作之間共享的發生將使用RFO消息宣佈。這將影響性能。

所以,換句話說,保持寫入到相同的核心,就像你可以在同一高速緩存行。

的更多信息可以在這裏找到 - > What Every Programmer Should Know About Memory

/安德斯

相關問題