2009-06-11 66 views
3

有谁知道C#中锁定免费散列表的实现?或者任何人都可以证实,至少读取HashTable是线程安全的?C#锁定免费散列表#

编辑:

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

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

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

+1

快速查看文档将确认这个 - HTTP:// msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx – RichardOD 2009-06-11 18:17:19

回答

5

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

0

由于Orion的说法,您可能想将散列表与ReaderWriterLock结合使用。

3

documentation

Hashtable是线程安全的供 多读线程和一个 写线程。 多线程使用时线程安全 线程执行写入(更新) 操作,它允许锁定 读取提供的作家是 序列化到哈希表。为了 支持多种作家Hashtable中所有 操作必须 通过 Synchronized方法返回的包装完成,前提是 没有线程读取 Hashtable对象。

枚举通过集合是 本质上不是线程安全的 程序。即使集合是 同步,其他线程仍可以 修改集合,这会导致枚举器引发 引发异常。 要在枚举中保证线程安全,您可以在整个 枚举期间锁定 集合,或者捕获由其他 线程所做更改产生的异常 。

1

您可以通过创建一个新的,每次修改时交换它写自己锁免费哈希表 - 它工作得很好,如果你不经常修改。 (因为阅读起来非常便宜,而且写起来非常昂贵)。

否则,如果您写了很多,我会推荐使用ReaderWriterLockSlim(假设您阅读的内容比您写的更多)或Monitor(锁定语句)。

2

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

+0

是一个线程安全但不锁定 – nim 2015-04-11 07:08:05