給定一個(雙重)鏈接的對象列表(C++),我有一個操作,我希望多線程,執行每個對象。每個對象的操作成本並不統一。由於各種原因,鏈表是該組對象的首選存儲。每個對象中的第一個元素是指向下一個對象的指針;第二個元素是列表中的前一個對象。多線程鏈表遍歷
我已經通過構建節點數組並應用OpenMP解決了該問題。這給了體面的表現。然後,我切換到自己的線程例程(基於Windows原語),並通過使用InterlockedIncrement()(作用於數組中的索引),我可以實現更高的整體CPU利用率和更快的吞吐量。從本質上講,這些線程通過沿着元素「跳躍式」進行工作。
我的下一個優化方法是嘗試消除創建/重用鏈表中的元素數組。但是,我想繼續使用這種「跳躍式」方法,並以某種方式使用一些不存在的例程(可以稱爲「InterlockedCompareDereference」)來自動比較NULL(列表結束)並有條件地取消引用存儲,並返回解除引用的值。
我不認爲InterlockedCompareExchangePointer()將工作,因爲我不能原子取消引用指針並調用此Interlocked()方法。我已經做了一些閱讀,其他人則提出了關鍵部分或自旋鎖。關鍵部分在這裏看起來很重。我很想嘗試旋轉鎖,但我想我會先在這裏提出問題,並詢問其他人在做什麼。我不相信InterlockedCompareExchangePointer()方法本身可以像旋轉鎖一樣使用。那麼還必須考慮獲取/釋放/籬笆語義......
想法?謝謝!
這對於少量的線程很有效,但是如果你例如考慮1000線程,你最終會得到一個內存障礙的_lot_,因爲「skipjumping」1000個條目是昂貴的(10000個列表項會少一點超過10M內存障礙) –
我沒有修改列表,只是希望有很多線程能夠有效地遍歷列表。 –