用锁定和不用(c#)计算线程(Counting threads with lock and without (c#))
Grant Crofton对“无序线程问题”问题的回答有一个评论:
“如果你取消锁定,最终计数可能会小于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); } } }Grant Crofton's answer to the question "Unordered threads problem" has a comment:
"And if you remove the lock the final count might be less than 100."
Why?
Here is the code for context
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这些称为种族条件 ,并通过使原子操作来解决
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 = 2This is what could happen without a lock:
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 = 1These are called Race Conditions and are solved by making the operation 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更多推荐
发布评论