有没有人知道C#中无锁哈希表的实现?或者任何人都可以确认至少读取HashTable是线程安全的事实吗?
编辑:
我可以阅读文档,但目前还不清楚。
“当只有一个线程执行写入(更新)操作时,多线程使用是线程安全的。”
所以,问题是,如果我有多个线程,并且所有都可以写入哈希表,我会使用writerlock。但是,这些相同的线程也从哈希表中读取。我是否需要阅读器上的读卡器?
答案 0 :(得分:5)
读取是线程安全的,直到修改集合。
答案 1 :(得分:3)
Hashtable是线程安全的 多个读者线程和单个 写线程。它是线程安全的 多线程使用时只有一个 线程执行写入(更新) 操作,允许无锁 如果作者是 序列化为Hashtable。至 支持多个作家 Hashtable上的操作必须是 通过返回的包装器完成 同步方法,提供 没有线程在阅读 Hashtable对象。
通过集合枚举是 本质上不是线程安全的 程序。即使是收藏品 同步,其他线程仍然可以 修改集合,这会导致 枚举器抛出异常。 确保螺纹安全 枚举,你可以锁定 整个收集 枚举或捕获异常 由其他人做出的改变 线程。
答案 2 :(得分:3)
我现在可以回答这个问题的第一部分:
有没有人知道C#中无锁哈希表的实现?
刚刚发布了一个alpha版本:
https://github.com/hackcraft/HackCraft.LockFree
我在https://bitbucket.org/JonHanna/ariadne和https://github.com/hackcraft/Ariadne
有一个答案 3 :(得分:2)
此外,.NET 4.0正在向System.Collections.Concurrent命名空间添加ConcurrentDictionary ...
答案 4 :(得分:1)
您可以通过创建一个新的哈希表来编写自己的无哈希哈希表,并在每次修改它时进行交换 - 如果您不经常修改它,它就可以正常工作。 (因为阅读起来非常便宜而且编写起来非常昂贵)。
否则,如果你写了很多,我建议使用ReaderWriterLockSlim(假设你读的比你写的多)或监视器(锁定语句)。
答案 5 :(得分:0)
您可能希望将哈希表与ReaderWriterLock结合使用,因为Orion说道。