c# - 为什么 "lock" block 不起作用?

标签 c# thread-safety

public class ThreadInteroperateWithLock
{
    private int m_count;
    private object m_synLock;
    public ThreadInteroperateWithLock() 
    {
        m_count = 0;
        m_synLock = new object();
    }

    public int Count { get { return m_count; } }

    public void Add() 
    {
        //just simulate some work
        int temp=0;
        for (int i = 0; i < 10000; i++)
        {
            temp++;
        }

        //really job
        lock (m_synLock)
        {
            m_count++;
        }
    }
}

此代码位于控制台应用程序中:

ThreadInteroperateWithLock ope = new ThreadInteroperateWithLock();
Thread[] threadArray = new Thread[100];
for (int i = 0; i < 100; i++)
{
    Thread thread = new Thread(new ThreadStart(ope.Add));
    thread.IsBackground = false;
    threadArray[i] = thread;
}
for (int i = 0; i < 100; i++)
{
    threadArray[i].Start();
}
Console.WriteLine(ope.Count);
Console.ReadKey();

有时它会打印“99”,有时会打印“100”,无论 lock{...} block 是否存在。我的代码有什么问题吗?

最佳答案

这里的问题是您正在启动线程,但在您调用将输出写入控制台时它们还没有完全完成。

循环从 i 个线程开始,我们将它们想象成蜜蜂作为工作去收集食物,并不是所有的都去同一个食物源,所以有些人比其他人需要更长的时间才能返回;然后,回到 hive ,我们突然说:“嘿,蜜蜂,我需要数一数!”,“……1、2、3……,只有三个?”不,一些 i-3 还在外面四处乱窜!

因此,我们的想法是,我们必须有一个指示器来指示工作何时完成,或者某种归巢信号,以使所有蜜蜂返回 hive 进行人数统计。这可以通过 Join 来完成,或手动状态检查(基本上让你坚持到最后一个寄居者返回。)

关于c# - 为什么 "lock" block 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346338/

相关文章:

java - 如何包装 ConcurrentSkipListSet 以线程安全的方式保持最新值的固定容量?

java - 如何使用 get 和 put 作为原子操作使并发 HashMap 线程安全?

c# - SQL Server 2005 - 当主键改变时在两个数据库之间移动数据的最佳方式

c# - WPF窗口中的透明PNG

c# - Entity Framework - 一个 edmx 文件中的所有表

c# - 不使用 'SqlDependency' 类监控数据库变化

c# - 如何在 WPF 中设置复选框的初始状态(在 XAML 或代码中)?

java - Android 主线程 Looper 关注点

c# - C#中的基本算术运算是原子的吗

.net - ReadOnlyCollection <T>线程安全