c# 线程等待和唤醒
时间: 2024-09-30 15:11:27 浏览: 39
在 C# 中,线程等待和唤醒是通过线程同步机制来控制多个线程间的协同工作的。主要有两个关键方法:
1. **等待(Waiting)**:
- 使用 `Monitor.Wait()` 方法,配合 `Enter()` 获得锁,当一个线程需要等待某个条件(比如资源可用)时,它会在锁上挂起自身。例如:
```csharp
lock (lockObject) {
// 执行操作...
Monitor.Wait(lockObject, timeout); // 等待直到唤醒或超时
}
```
如果在指定时间内没有被其他线程唤醒(通过 `Monitor.Pulse(lockObject)` 或 `Monitor.PulseAll(lockObject)`),那么线程就会一直等待直到超时。
2. **唤醒(Pulse 或 PulseAll)**:
- `Monitor.Pulse(lockObject)` 用于唤醒单个正在等待的线程,持有同一锁的对象。
- `Monitor.PulseAll(lockObject)` 则唤醒所有等待在同一锁上的线程。
这些方法通常配合互斥量(Mutex)、信号量(Semaphore)或自旋锁(SpinLock)等同步结构一起使用,使得线程之间能够按照预期的方式协调工作,比如生产者消费者模式、并发队列处理等。
**注意事项**:
- 需要注意的是,在等待前必须先获得锁,以免发生死锁现象。
- 如果一个线程被无限次唤醒而无法继续执行(因为条件未变),那么可能会造成不必要的性能损耗。
阅读全文