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