.net - 为什么在调用 Monitor.Wait() 之前必须获取监视器

标签 .net multithreading wait

如果线程在当前不拥有的锁对象上调用 Monitor.Wait(lockObj),则将引发 SyncronizationLockException

我不明白这有什么意义?如果线程确实拥有锁,因此可以成功调用 Monitor.Wait() 那么它无论如何都会立即释放锁。为什么线程不能只等待它当前不拥有的锁?


更新

我决定对我的问题添加更多解释。

据我了解,Wait 只是将当前线程放入监视器等待队列并释放锁。稍后,一个脉冲或脉冲全部将等待队列上的一个或所有线程移动到就绪队列。每当监视器被释放时,就绪队列上的下一个(如果有)线程就会获得锁定。

那么为什么 wait 不能简单地将线程添加到等待队列中呢?为什么需要获取锁才能做到这一点?这是否有物理原因,或者只是 Microsoft 设计该类来强制您以正确的方式使用它?

现在我想了一下,我猜想将某些内容放入监视器的等待队列中,或者将某些内容移动到就绪队列中,这实际上是在操纵监视器。您需要拥有显示器才能执行此操作,这是有道理的。这是正确的思考方式吗?

亏我的脑子多线程很难!

最佳答案

Monitor.Wait 的目的是让其他线程有机会获取您的锁。

如果你一开始就不拥有锁,那就没有意义;其他线程已经可以获取锁了。
(除非其他线程已经拥有该锁,在这种情况下调用 Wait 会扰乱该线程)

关于.net - 为什么在调用 Monitor.Wait() 之前必须获取监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754424/

相关文章:

c++ - 与普通变量相比,仅读取原子变量是否有性能差异?

Powershell 启动进程、超时等待、杀死并获取退出代码

java - 不使用 wait 关键字同步块(synchronized block)是否安全?

windows-7 - SWI Prolog 中的文件异常处理和等待进程

c# - 通过 C# 代码将 appSettings 部分添加到 web.config

.net - 寻找对象数据库

c++ - Boost线程泄漏C++

c# - 在 C# 中,为什么 List<string> 对象不能存储在 List<object> 变量中

c# - Azure 驱动器、 block Blob 与表

multithreading - 获取当前线程句柄