2015-11-03 64 views
3

我在寫一個多線程應用程序。該應用程序包含一個長度數組,如1000.數組上的多線程/我需要鎖定機制嗎?

如果我現在有兩個線程,我會確保,線程1將只訪問元素0-499,線程2只會訪問元素500- 999,我需要一個鎖定機制來保護陣列,否則會很好。

注意:只有數組的內容將在計算過程中更改!陣列不會被移動,memcpy編輯或以某種其他方式改變比陣列內的改變元素。

回答

2

你想要的是完美的!這些策略(與一堆低級原子基元融合在一起)是所謂的無鎖編程的基礎。

+0

非常感謝! – Nidhoegger

2

實際上,在實施此解決方案時可能存在問題。你必須強烈保證你提到的屬性。

  1. 請確保您的內存數據數組永遠不會移動。你不能依賴大多數std容器。他們中的大多數在修改期間可能會發生顯着變化std::map正在重新平衡內部樹,並使一些內部指針無效。 std::vector有時會在插入時重新分配整個容器。

  2. 確保只有一個消費者,並且只有一個生產者擁有您的任何數據。每個消費者必須以有效狀態存儲內部迭代器,以防止兩次讀取相同的項目,或者跳過某個項目。每個生產者必須將數據放在有效位置,而不可能覆蓋現有的,未讀取的數據。

任何的這個規則,不服從讓你需要實現互斥。