2016-01-24 52 views
5

我有一個龐大的數據陣列,我需要從/從不同線程的隨機地點讀/寫。有一個mutex顯然會殺死性能。我的想法是有很多mutexes每個負責特定範圍的數組。這樣在寫入之前,我可以鎖定一個正確的mutex根據索引在我要寫的數組。理論上它可以減少種族。但我想知道 - 也許有更好的方法?並行寫入數組

+0

如果一個工作人員讀取位置A,然後寫入位置B,您如何確保兩者之間沒有變化,從而使結果變得毫無意義?我問的原因是因爲如果有訪問模式,他們可能會採取更好的方法,例如,生產者 - 消費者模式的變化,最好使用隊列來解決。 –

+0

我無法確定。模式是未知的 - 它是某種深度緩衝區。這就是讀寫應該在一個鎖中完成的原因。 – nikitablack

+0

我還是不明白:你是否讀過一個元素,對它執行一些操作,然後回寫那個元素?如果是這種情況,您可以提取選擇元素的算法,然後通過簡單的生產者 - 消費者隊列將它們分發給工作線程,並同樣將其傳回以存儲結果。 –

回答

4

這聽起來像是一種合理的方式。

有一些事情要考慮,雖然:

  1. 幽州,你的想法是有「許多互斥體,每一個負責陣列特定的範圍」。您應該考慮訪問模式,以決定如何將條目分配給互斥鎖。如果線程傾向於在接近的條目上工作,則可以考慮使用不同的方案將條目分配給互斥體,例如,條目索引以互斥體的數量爲模。

  2. 根據經驗,請注意,互斥量應由線程數決定,而不是範圍的大小。我在this question上寫過這篇文章(在撰寫本文的時候,這是公認的答案)。

  3. 再次根據使用模式,您應該考慮使用讀/寫鎖,以避免對同一條目上的多個讀取器進行不必要的序列化。因人而異。

+1

只是對「事物1」的一個小評論 - 如果線程適用於附近的元素,應該注意[false sharing](https://en.wikipedia.org/wiki/False_sharing) – Rostislav

+0

@Rostislav,是的,謝謝 - 這是一個好點。 –

+0

@AmiTavory謝謝。我真的很喜歡這種模式)。 – nikitablack