gpt4 book ai didi

c# - 抵御 System.Collections.Concurrent.ConcurrentDictionary 中的竞争条件

转载 作者:太空狗 更新时间:2023-10-30 00:33:43 26 4
gpt4 key购买 nike

.NET ConcurrentDictionary 易受竞争条件的影响,可能会导致意外数据,如 at the bottom of this MSDN article. 所述我假设有几个因素需要考虑。

问:我应该如何编写不易受可能导致数据丢失的竞争条件影响的代码?

在我的场景中,我有一个输入流,它的索引总是递增 (n++)。我的想法是我可以detect missing data如果出现竞争条件并重新发送。另一方面,可能有一种我不知道的更好的方法来执行此操作。

最佳答案

人们必须意识到并发集合(不限于 .net)存在一个普遍的缺陷,即单个操作可能是线程安全的,但操作序列不是原子的。我的意思如下:假设这种情况,我有一个带有 CheckAdd 操作的并发集合,两者都是原子的。

我想做的是检查一个值是否存在,如果不存在,则添加它。所以我可以这样写:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com