[英]Singly-linked list insertion synchronization
假設我有一個排序的,單鏈接的N個整數列表,其中沒有重復項,並且k個線程(其中k << N ),每個都嘗試將一些整數(大於頭節點)插入到列表中。
是否可以將插入同步到這樣的列表中,以便:
?
首先,如果插入集合只是一個非常罕見的任務,那么鏈表不是一個很好的解決方案 - 因為找到插入點是O(N)
操作,即使對於排序列表,因此最終縮放嚴重。
如果你仍然需要這樣做,可以將一個插入(不像刪除)作為無鎖操作執行排序列表,但要小心:
cur
cur
/ cur->next
) 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
並重復跳舞(列表已排序,有人插在我們面前) 即嘗試鏈接新節點的結果是要么我們成功,要么有人打敗我們插入相同的節點(在這種情況下我們沒有 - 它已經存在),或有人插入間隙(即現有的是N
, N+3
,我們嘗試了N+1
,其他人成功了N+2
)在這種情況下我們重試直到我們成功或者找到其他人完成的“我們的”節點。
同步刪除要困難得多; 查找RCU(讀取 - 復制 - 更新)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.