簡體   English   中英

單鏈表插入同步

[英]Singly-linked list insertion synchronization

假設我有一個排序的,單鏈接的N個整數列表,其中沒有重復項,並且k個線程(其中k << N ),每個都嘗試將一些整數(大於頭節點)插入到列表中。

是否可以將插入同步到這樣的列表中,以便:

  • 線程可能只阻止對其(直接)前一節點的訪問
    (沒有鎖定“整個列表”)
  • 最多可以使用O(k)互斥量和條件變量
  • 不會發生搶占/中斷

首先,如果插入集合只是一個非常罕見的任務,那么鏈表不是一個很好的解決方案 - 因為找到插入點是O(N)操作,即使對於排序列表,因此最終縮放嚴重。

如果你仍然需要這樣做,可以將一個插入(不像刪除)作為無鎖操作執行排序列表,但要小心:

  1. 找到插入點, cur
  2. 創建新節點(指定上一個/下一個鏈接到cur / cur->next
  3. 原子操作: compare_and_swap(cur->next, new, new->next);
    如果失敗: if (new->value == next->value) return; // someone beat us to it if (new->value == next->value) return; // someone beat us to it
    否則: cur = cur->next並重復跳舞(列表已排序,有人插在我們面前)

即嘗試鏈接新節點的結果是要么我們成功,要么有人打敗我們插入相同的節點(在這種情況下我們沒有 - 它已經存在),或有人插入間隙(即現有的是NN+3 ,我們嘗試了N+1 ,其他人成功了N+2 )在這種情況下我們重試直到我們成功或者找到其他人完成的“我們的”節點。

同步刪除要困難得多; 查找RCU(讀取 - 復制 - 更新)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM