inn*_*227 5 c# dictionary thread-safety
以下代码线程是否安全?
var dict = new Dictionary<int, string>()
{ { 0, "" }, { 1, "" }, { 2, "" }, { 3, "" } };
var nums = dict.Keys.ToList();
Parallel.ForEach(nums, num =>
{
dict[num] = LongTaskToGenerateString();
});
return dict;
Run Code Online (Sandbox Code Playgroud)
不,Dictionary<TKey, TValue>类在修改时不是线程安全的,如文档中所示:
A
Dictionary<TKey, TValue>可以同时支持多个读取器,只要不修改集合即可.即便如此,通过集合枚举本质上不是一个线程安全的过程.在枚举与写访问争用的极少数情况下,必须在整个枚举期间锁定该集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.
在你的情况下,如果一些线程LongTaskToGenerateString几乎同时完成他们的字典更新将干扰.
您可以使用该SyncRoot属性手动同步访问,也可以按照评论中asawyer的ConcurrentDictionary<TKey, TValue>建议选择该类.
这个实现表明,如果你只是更新现有键的值,它应该没问题(也看这个) - 不优雅的效果可能是version属性的不准确值.它用于防止在枚举时修改集合,因此它最终会达到什么值并不重要.但是不知道有关于此的任何保证.
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |