2015-10-16 57 views
1

我們有存儲在互鎖單向鏈表中的線程之間共享的數據。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684121(v=vs.85).aspx如何安全迭代聯鎖slist?

我們知道列表在初始化後不會改變,但我們希望各個線程能夠迭代和讀取列表的內容。有沒有一種安全的方式來讀取/迭代slist?

當前代碼使用InterlockedFlushSList將列表中的節點OUT取出,然後創建數據的臨時副本,然後將節點放回到slist中。如果在線程之間共享slist,看起來像是等待發生的競爭狀態。

沒有隻是去一個不同的線程安全的結構是一個安全的方式來讀取迭代slist?

+1

SergeyA是對的。如果數據在閱讀時永不改變,那麼您根本不需要鎖定數據。在另一個迭代發生時從任何上下文迭代一個不可變容器是安全的。 –

+0

調用'RtlFirstEntrySList'獲取第一個條目,然後遍歷'SLIST_ENTRY.Next'指針。 –

回答

3

讀取任何列表在多線程環境中都是安全的,提供的列表在讀取時不會被修改。你甚至不需要'聯鎖'列表。

+0

好點。在查看代碼中的用法之後,我只是刪除了所有聯鎖的東西。這對我們的案件無關緊要。謝謝 – meissnersd