用锁定和不用(c#)计算线程(Counting threads with lock and without (c#))

编程入门 行业动态 更新时间:2024-10-28 06:27:59
用锁定和不用(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 = 2

This 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 = 1

These 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

更多推荐

本文发布于:2023-07-31 10:54:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1343790.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程   Counting   lock   threads

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!