簡體   English   中英

在std :: list中沒有鎖定的並行追加和迭代

[英]Parallel append and iteration without locks in std::list

我在多線程程序中使用std :: list。 元素僅添加到列表的末尾,並且僅從列表的開頭除去。 存在一個寫程序鎖,以確保相互排斥寫操作。 讀者無需獲取鎖即可訪問列表。 讀者維護着迭代器,而這些迭代器不能被Erase()無效,因為我保證只有讀者通過了這些元素后,它們才會被擦除。 我能想象的唯一可能的數據競爭是是否添加了元素,並且其中一個讀取器在插入程序編寫元素本身之前訪問了該元素。

對於單個編寫器,追加(末尾插入)應該是原子的,因為插入單個元素需要單次寫入。

std :: list顯然不提供任何保證,有人可以確認上述用法應該在沒有數據爭用的情況下起作用。 如果沒有,是否有其他替代方法(例如,助推器)提供這種保證?

如您所寫,可能會發生競爭狀況:

我能想象的唯一可能的數據競爭是是否添加了元素,並且其中一個讀取器在插入程序編寫元素本身之前訪問了該元素。

另外std :: list是一個雙向鏈接的列表 ,因此在刪除第一個元素時,第二個元素將被訪問,而在添加新元素時,舊的最后一個元素將被寫入。 因此,您的迭代器必須是常量(沒有++ iter或--iter)。

您可能想看看boost :: lockfree :: queue -可能正是您想要的。

我使用了boost :: intrusive :: list解決了禁用大小計數器時的問題,該問題在同時刪除和插入元素時變得不一致。 沒有這個,增強列表會設置四個指針,而在刪除/插入元素時沒有其他設置。

暫無
暫無

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

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