gpt4 book ai didi

c# - 为什么 lock ("myLock") 会导致问题?

转载 作者:行者123 更新时间:2023-11-30 19:54:04 24 4
gpt4 key购买 nike

我已阅读 Microsoft 的 C# 引用中的以下内容:

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

具体是什么意思?

下面的代码是否没有像我预期的那样工作? (我希望 ReadyCount 是一致的)

public class Calculator
{
public int ReadyCount { get; private set; }

public void IncreaseReadyCount()
{
lock ("ReadyCount")
{
ReadyCount++;
}
}

public void Calculate()
{
Parallel.ForEach(list, litItem =>
{
IncreaseReadyCount();
});
}
}

最佳答案

问题是:那把锁的范围是什么? 你不能告诉;它至少等同于您的Calculator类型的静态/全局,但它也可以巧合地被任何地方的任何其他代码共享 恰好执行 ldstr 'ReadyCount'(返回实习版本)并对其进行锁定(或使用 Monitor , ETC)。不太可能,但有风险。

更重要的是,对于普通读者来说,它并不明显,这是一个问题。如果您打算它是一个静态/全局锁,那么这等同于您的代码,但更明显并且没有无关代码偶然获取锁的风险:

static readonly object readyCountLock = new object();
...
lock(readyCountLock) {...}

有了这个,至少它在做什么是显而易见的。


不过,就个人而言,我很想只使用 Interlocked.Increment(ref _someField) :)

关于c# - 为什么 lock ("myLock") 会导致问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019361/

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