如何安全地迭代互锁的 slist?
Posted
技术标签:
【中文标题】如何安全地迭代互锁的 slist?【英文标题】:How to safely iterate an interlocked slist? 【发布时间】:2015-10-16 15:19:31 【问题描述】:我们在一个互锁的单链表中存储了线程之间共享的数据。https://msdn.microsoft.com/en-us/library/windows/desktop/ms684121(v=vs.85).aspx
我们知道列表在初始化后不会改变,但我们希望各个线程能够迭代并读取列表的内容。有没有一种安全的方法来阅读/迭代一个 slist?
当前代码使用 InterlockedFlushSList 从列表中取出节点,然后制作数据的临时副本,然后将节点放回 slist。如果 slist 是在线程之间共享的,那似乎是一个等待发生的竞争条件。
如果不使用不同的线程安全结构,是否有一种安全的方式来读取迭代 slist?
【问题讨论】:
SergeyA 是对的。如果数据在您读取时从未更改,那么您根本不需要锁定它。在发生另一次迭代时,从任何上下文迭代一个不可变容器是安全的。 调用RtlFirstEntrySList
获取第一个条目,然后遍历SLIST_ENTRY.Next
指针。
【参考方案1】:
在多线程环境中读取任何列表都是安全的,只要列表在读取时不被修改。你甚至不需要它的“联锁”列表。
【讨论】:
好点。在查看了代码中的用法后,我刚刚删除了所有互锁的东西。这对我们的情况无关紧要。谢谢以上是关于如何安全地迭代互锁的 slist?的主要内容,如果未能解决你的问题,请参考以下文章
sh 使用find with print0安全地将带有任何合法字符的文件名或文件路径写入数组并迭代它们。