在 C# 中,Thread.Yield 方法的作用是什么?在哪些场景下应该使用它?
考察说明
考查对线程调度中主动让出 CPU 机制的理解及适用场景。
回答思路
- 【回答框架 1】Thread.Yield 是 Thread 类的静态方法,调用后当前线程主动让出处理器,允许同优先级或更高优先级的就绪线程运行,但仅在当前处理器上让出,不保证其他处理器上的线程能运行。
- 【回答框架 2】其核心机制是向操作系统提示当前线程愿意放弃剩余时间片,但调度器可能忽略该提示,因此它不保证立即让出或让出后何时恢复。
- 【回答框架 3】适用场景包括自旋等待或忙等循环中,避免独占 CPU 导致其他线程饥饿,例如实现轻量级锁或等待某个标志位变化时,可结合 SpinWait 使用。
- 【回答框架 4】与 Thread.Sleep(0) 相比,Yield 只让出给同优先级或更高优先级的线程,而 Sleep(0) 让出给任意就绪线程;与 Task.Yield 相比,后者用于异步上下文,让出给后续任务。
- 【回答框架 5】使用时需注意,Yield 不适用于需要跨处理器调度或保证公平性的场景,且频繁调用可能增加开销,应优先考虑使用 Monitor、Semaphore 等同步原语。
- 【关键点 1】Thread.Yield 让出当前线程的剩余时间片,仅针对同优先级或更高优先级的就绪线程。
- 【关键点 2】它不保证立即让出,操作系统可能忽略该请求。
- 【关键点 3】适用于自旋等待或忙等循环,避免独占 CPU。
- 【关键点 4】与 Thread.Sleep(0) 和 Task.Yield 在让出范围和上下文上有区别。
- 【关键点 5】在需要可靠同步时,应使用锁或信号量等原语,而非依赖 Yield。
- 【易错点 1】误以为 Yield 能保证其他线程运行,实际可能被调度器忽略。
- 【易错点 2】在低优先级线程中调用 Yield 可能无法让出给高优先级线程,导致优先级反转。
- 【易错点 3】过度使用 Yield 可能增加上下文切换开销,降低性能。