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/