Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对While循环中的锁调用Monitor.Wait()的目的是什么?_C#_Multithreading_Locking - Fatal编程技术网

C# 对While循环中的锁调用Monitor.Wait()的目的是什么?

C# 对While循环中的锁调用Monitor.Wait()的目的是什么?,c#,multithreading,locking,C#,Multithreading,Locking,我在野外,在构造函数中偶然发现了以下代码片段: lock (_lock) while (0 != x) Monitor.Wait(_lock); 我真的不确定这是在做什么,以及它的目的。我读过关于班长的报道,等等 当线程调用Wait时,它释放对象上的锁并进入对象的等待队列。对象就绪队列中的下一个线程(如果有)获取锁并独占使用对象 假设我是锁定\u lock的线程。而(x!=0),其中x最有可能被另一

我在野外,在构造函数中偶然发现了以下代码片段:

            lock (_lock)
                while (0 != x)
                    Monitor.Wait(_lock);
我真的不确定这是在做什么,以及它的目的。我读过关于班长的报道,等等

当线程调用Wait时,它释放对象上的锁并进入对象的等待队列。对象就绪队列中的下一个线程(如果有)获取锁并独占使用对象

假设我是锁定
\u lock
的线程。而(x!=0),其中
x
最有可能被另一个线程更新。我正在释放要更新的x,它由队列中的下一个线程更新,然后我可以自由地检查
x!=0
在另一个线程释放其在
x
上的锁之后

此外,如果就绪队列中没有线程怎么办?我看到,
Monitor.Pulse(\u lock)
在代码的其他部分(一个单独的函数)被调用为一个事件引发的方法

            lock (_lock)
                Monitor.Pulse(_lock);

提前感谢您的解释。

代码似乎获得了锁,然后继续释放并获得锁,直到
x==0
@RufusL是否这样做,以便被锁阻止的另一个线程可以进入并更改
x
?这是否回答了您的问题@RufusL,Re,“…然后继续发布和获取…”如果正确使用,将不会有很多发布和获取周期。
Wait(\u lock)
调用所做的最重要的事情是等待。具体地说,它会等待其他线程调用Monitor.Pulse(\u lock)。另一个线程只有在更改了
x
的值后才能执行此操作@蒂扎道克大概是的。正如@SolomonSlow所提到的,循环执行次数可能不会超过几次,但它实际上取决于有多少其他任务在
\u lock
对象上获得锁,这些锁不会改变
x