为c#锁定免费哈希表

时间:2009-06-11 18:09:39

标签: c# multithreading

有没有人知道C#中无锁哈希表的实现?或者任何人都可以确认至少读取HashTable是线程安全的事实吗?

编辑:

我可以阅读文档,但目前还不清楚。

“当只有一个线程执行写入(更新)操作时,多线程使用是线程安全的。”

所以,问题是,如果我有多个线程,并且所有都可以写入哈希表,我会使用writerlock。但是,这些相同的线程也从哈希表中读取。我是否需要阅读器上的读卡器?

6 个答案:

答案 0 :(得分:5)

读取是线程安全的,直到修改集合。

答案 1 :(得分:3)

来自documentation

  

Hashtable是线程安全的   多个读者线程和单个   写线程。它是线程安全的   多线程使用时只有一个   线程执行写入(更新)   操作,允许无锁   如果作者是   序列化为Hashtable。至   支持多个作家   Hashtable上的操作必须是   通过返回的包装器完成   同步方法,提供   没有线程在阅读   Hashtable对象。

     

通过集合枚举是   本质上不是线程安全的   程序。即使是收藏品   同步,其他线程仍然可以   修改集合,这会导致   枚举器抛出异常。   确保螺纹安全   枚举,你可以锁定   整个收集   枚举或捕获异常   由其他人做出的改变   线程。

答案 2 :(得分:3)

我现在可以回答这个问题的第一部分:

  

有没有人知道C#中无锁哈希表的实现?

刚刚发布了一个alpha版本:

https://github.com/hackcraft/HackCraft.LockFree

我在https://bitbucket.org/JonHanna/ariadnehttps://github.com/hackcraft/Ariadne

有一个

答案 3 :(得分:2)

此外,.NET 4.0正在向System.Collections.Concurrent命名空间添加ConcurrentDictionary ...

答案 4 :(得分:1)

您可以通过创建一个新的哈希表来编写自己的无哈希哈希表,并在每次修改它时进行交换 - 如果您不经常修改它,它就可以正常工作。 (因为阅读起来非常便宜而且编写起来非常昂贵)。

否则,如果你写了很多,我建议使用ReaderWriterLockSlim(假设你读的比你写的多)或监视器(锁定语句)。

答案 5 :(得分:0)

您可能希望将哈希表与ReaderWriterLock结合使用,因为Orion说道。