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

标签 c# parallel-processing locking parallel.foreach

我已阅读 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/

相关文章:

c# - 在 wpf 中显示用户控件的替代方法

c - 如何用 C 编写跨平台的并行程序?

hadoop - 如何在Hadoop和Yarn中并行化MapReduce作业?

java - 另一个就餐哲学家并发问题

c++ - 阻塞的互斥量有多昂贵?

c# - 有没有办法导致传递给 Control.BeginInvoke 的委托(delegate)的类型推断?

c# - 如何使用 Entity Framework 6 Code First 设置默认值约束?

c# - 在制作动态 URL 时执行字符串连接的最佳方法是什么?

haskell - Rand 的 MonadParallel 实例

java - Java 中的 AutoLock - 如何操作?