我有一個龐大的數據陣列,我需要從/從不同線程的隨機地點讀/寫。有一個mutex
顯然會殺死性能。我的想法是有很多mutexes
每個負責特定範圍的數組。這樣在寫入之前,我可以鎖定一個正確的mutex
根據索引在我要寫的數組。理論上它可以減少種族。但我想知道 - 也許有更好的方法?並行寫入數組
並行寫入數組
回答
這聽起來像是一種合理的方式。
有一些事情要考慮,雖然:
幽州,你的想法是有「許多互斥體,每一個負責陣列特定的範圍」。您應該考慮訪問模式,以決定如何將條目分配給互斥鎖。如果線程傾向於在接近的條目上工作,則可以考慮使用不同的方案將條目分配給互斥體,例如,條目索引以互斥體的數量爲模。
根據經驗,請注意,互斥量應由線程數決定,而不是範圍的大小。我在this question上寫過這篇文章(在撰寫本文的時候,這是公認的答案)。
再次根據使用模式,您應該考慮使用讀/寫鎖,以避免對同一條目上的多個讀取器進行不必要的序列化。因人而異。
只是對「事物1」的一個小評論 - 如果線程適用於附近的元素,應該注意[false sharing](https://en.wikipedia.org/wiki/False_sharing) – Rostislav
@Rostislav,是的,謝謝 - 這是一個好點。 –
@AmiTavory謝謝。我真的很喜歡這種模式)。 – nikitablack
- 1. 將數組寫入整行
- 2. 如何讓CUDA並行線程串行寫入數組?
- 3. C讀txt並寫入數組
- 4. 根據數組寫入行數
- 5. 如何寫入數組並執行計算
- 6. 將文本文件寫入數組並讀取特定行VB
- 7. 逐行讀取文件並寫入C++數組
- 8. 如何編寫並行數組
- 9. Python將多行寫入數組
- 10. 通過數組將行寫入Excel
- 11. 數組寫入CSV
- 12. Spark/Scala並行寫入redis
- 13. 並行讀取和寫入
- 14. Python並行寫入文件
- 15. R,並行寫入pdf
- 16. 並行文件寫入
- 17. hbase併發寫入一行
- 18. 並行讀取/寫入ADLA
- 19. 打印並寫入一行?
- 20. Golang net.Conn並行寫入
- 21. 合併行,並填寫組內NaN值
- 22. 並行數組
- 23. 解析多個數組並寫入所有可能的組合
- 24. 並行數組,接受多個輸入
- 25. 將文本文件讀入字符串數組(並寫入)
- 26. 如何在行和下一個數組的相同數組中寫入項目跳過一行並在Python中的下一行寫入項目
- 27. 從C++中讀取共享數組並寫入數據
- 28. 將數組寫入Three.WebGLRenderTarget
- 29. C寫入數組結構
- 30. 將3D數組寫入HDF5
如果一個工作人員讀取位置A,然後寫入位置B,您如何確保兩者之間沒有變化,從而使結果變得毫無意義?我問的原因是因爲如果有訪問模式,他們可能會採取更好的方法,例如,生產者 - 消費者模式的變化,最好使用隊列來解決。 –
我無法確定。模式是未知的 - 它是某種深度緩衝區。這就是讀寫應該在一個鎖中完成的原因。 – nikitablack
我還是不明白:你是否讀過一個元素,對它執行一些操作,然後回寫那個元素?如果是這種情況,您可以提取選擇元素的算法,然後通過簡單的生產者 - 消費者隊列將它們分發給工作線程,並同樣將其傳回以存儲結果。 –