.NET ConcurrentDictionary 容易受到可能导致意外数据的竞争条件的影响,正如 at the bottom of this MSDN article. 我假设有几个因素需要考虑。
问: 我应该如何编写不易受到可能导致数据丢失的竞争条件的代码?
在我的场景中,我有一个输入流,它的索引总是增加 (n++)。我的想法是,如果发生竞争条件,我可以 detect missing data 并重新发送它。另一方面,可能有一种我不知道的更好的方法来做到这一点。
最佳答案
人们必须注意并发集合(不限于 .net)的一个普遍缺陷,即 单个操作可能是线程安全的,但操作序列不是原子 。我的意思是这样的:假设这个场景,我有一个带有 Check
和 Add
操作的并发集合,这两个操作都是原子的。
我想要做的是检查值是否存在,如果不存在,则添加它。所以我可以这样写:
if(!collection.Check(value))
{
collection.Add(value);
}
虽然这两个操作都是原子的,但上面的顺序不是,因为一个线程可能会在检查和添加之间被另一个线程中断,从而导致结果不一致。因此,整个序列应该通过将其包装在
lock
语句中来实现原子化。lock(locker)
{
if(!collection.Check(value))
{
collection.Add(value);
}
}
关于c# - 防御 System.Collections.Concurrent.ConcurrentDictionary 中的竞争条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10565560/