Skip to main content
 首页 » 编程设计

c#之计算带锁和不带锁的线程 (c#)

2024年01月28日29dyllove98

Grant Crofton's answer对“无序线程问题”的问题有评论:

"And if you remove the lock the final count might be less than 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); 
        } 
    } 
} 

请您参考如下方法:

这是可能没有锁的情况:

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 来解决

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