2013-03-09 48 views
1

Grant Crofton's answer问题“无序线程问题”计数线程有一个评论:有锁和无(C#)

“如果你解除锁定的最终计数可能小于100元。”

为什么?

这里是上下文

class Program 
{ 
    static object locker = new object(); 
    static int count=0; 

    static void Main(string[] args) 
    { 
     for (int j = 0; j < 100; j++) 
     { 
      (new Thread(new ParameterizedThreadStart(dostuff))).Start(j); 
     } 
     Console.ReadKey(); 
    } 

    static void dostuff(object Id) 
    { 
     lock (locker) 
     { 
      count++; 
      Console.WriteLine("Thread {0}: Count is {1}", Id, count); 
     } 
    } 
} 

回答

4

这是被中断可以发生没有锁:

Count = 0 

ThreadA Reads Count As 0 
ThreadB Reads Count As 0 
ThreadA Writes New Incremented Count As 0 + 1 
ThreadB Writes New Incremented Count As 0 + 1 

Count = 1 

这些被称为Race Conditions并通过使操作Atomic

得到解决3210
Count = 0 

ThreadB Wins Race To Lock() 
ThreadB Reads Count As 0 
ThreadB Writes New Incremented Count As 0 + 1 
ThreadB Unlocks 

ThreadA Next for Lock() 
ThreadA Reads Count As 1 
ThreadA Writes New Incremented Count As 1 + 1 
ThreadA Unlocks 

Count = 2 
2

的代码,因为锁可防止从多个线程试图同时增加它的count变量。如果发生这种情况,可能会给你奇怪的结果。

该锁确保线程一次只能输入一个函数,因此只能一次执行一个函数。

如果你删除它,然后线程可以在同一时间进入,而在这些操作中,给你奇怪的结果,无序结果的中间,等

+0

奇怪的结果也意味着超过100? – Fulproof 2013-03-09 15:34:28

+0

不,因为启动线程的循环不会超过一百次。 – 2013-03-09 15:36:17