【发布时间】:2011-01-03 20:34:04
【问题描述】:
如果我初始化一个通用字典一次,并且不允许进一步的添加/更新/删除,那么在没有锁定的情况下让多个线程读取它是否安全(假设字典在读取器启动之前被初始化)?
非泛型 HashTable 的帮助中有一条注释说它对多个读者是安全的,但我没有看到泛型字典的类似内容。
【问题讨论】:
标签: c#
如果我初始化一个通用字典一次,并且不允许进一步的添加/更新/删除,那么在没有锁定的情况下让多个线程读取它是否安全(假设字典在读取器启动之前被初始化)?
非泛型 HashTable 的帮助中有一条注释说它对多个读者是安全的,但我没有看到泛型字典的类似内容。
【问题讨论】:
标签: c#
供您将来参考,文档在这里:
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
上面写着:
字典 可以支持多个阅读器 同时,只要 集合未修改。即使是这样, 通过集合枚举是 本质上不是线程安全的 程序。在极少数情况下 枚举与写竞争 访问,集合必须是 在整个枚举期间锁定。 允许访问集合 通过多个线程进行阅读和 写,你必须实现你自己的 同步。
【讨论】:
ConcurrentDictionary 枚举也是“本质上不是线程安全的过程”。对吗?
System.Collections.Concurrent.ConcurrentDictionary)通常允许在枚举期间进行修改。但是,他们通过制作集合的副本并让您枚举副本来实现此目的。并且在制作副本时整个收藏都被锁定。框架工程师可能会争辩说,这意味着您没有在枚举“飞行”时修改集合(因为在引擎盖下,整个事情在枚举“飞行”时被锁定),但从框架用户的角度来看,枚举正在进行中。
是的,如果您不再修改字典是安全的。线程安全只是读/写场景中的问题
【讨论】:
If I initialize a generic dictionary once, and no further adds/updates/removes are allowed, is it safe to have multiple threads reading from it with no locking (assuming that the dictionary is initialized before the readers are started)? 还可以吗