面试题答案
一键面试虚假唤醒场景
在Go语言中,条件变量的虚假唤醒指的是Cond
的Wait
方法在没有调用Cond
的Signal
或Broadcast
方法时就返回了。这可能发生在操作系统线程调度的不确定性等情况下。例如,在高并发环境下,多个协程同时竞争资源,当系统资源紧张时,调度器可能会在没有明确信号的情况下将等待中的协程唤醒。
处理方式
为了处理虚假唤醒,需要在Wait
返回后再次检查条件,确保满足预期的条件。在Go语言中,通常将条件检查放在一个循环中,这样即使发生虚假唤醒,协程也会再次检查条件,不会执行不符合条件的操作。
示例代码
package main
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
cond := sync.NewCond(&mu)
ready := false
go func() {
mu.Lock()
for!ready {
fmt.Println("等待条件满足...")
cond.Wait()
}
fmt.Println("条件满足,执行操作")
mu.Unlock()
}()
// 模拟其他操作
mu.Lock()
ready = true
fmt.Println("设置条件为满足")
cond.Broadcast()
mu.Unlock()
}
在上述代码中,for!ready
循环确保了即使发生虚假唤醒,协程也会再次检查ready
条件,只有当ready
为true
时才会执行后续操作。Wait
方法被调用时,协程会释放锁并等待信号,当收到信号(无论是正常信号还是虚假唤醒),Wait
返回,然后再次检查ready
条件。如果ready
为false
,则继续等待;如果为true
,则执行后续操作。