Monitor.Wait 和 Monitor.Pulse 是 C# 中基于对象的线程同步原语,用于实现等待-通知机制:Wait 释放锁并使线程进入等待队列,Pulse 向队列中一个线程发送唤醒信号但不释放锁,二者需配合循环条件检查使用。

在 C# 中,Monitor.Wait 和 Monitor.Pulse 是基于对象的底层线程同步机制,用于协调多个线程对共享资源的访问。它们常用于实现线程间的等待-通知逻辑,是比锁更精细的控制手段。
Monitor 的基本作用
Monitor 通过 Enter 和 Exit 方法实现互斥访问,确保同一时间只有一个线程能进入临界区。而 Wait 和 Pulse 则在此基础上扩展了线程间通信能力。
当一个线程持有某个对象的锁后,可以调用 Monitor.Wait 主动释放锁并进入等待状态。其他线程可通过 Monitor.Pulse 唤醒一个正在等待的线程,使其重新尝试获取锁并继续执行。
Wait:释放锁并等待通知
调用 Monitor.Wait(obj) 的前提是当前线程已拥有 obj 对象的锁。该方法会:
- 释放 obj 上的锁
- 将线程置入对象的“等待队列”
- 阻塞当前线程,直到被唤醒
- 被唤醒后,重新竞争锁,成功获取后才返回 Wait 调用
注意:Wait 返回并不表示条件成立,通常需在循环中检查条件。
Pulse:发送唤醒信号
Monitor.Pulse(obj) 用于向 obj 对象的等待队列中的一个线程发送唤醒信号。但它不会立即移交执行权:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~