MST

星途 面试题库

面试题:Go中条件变量虚假唤醒的场景及处理方式

请描述在Go语言中,条件变量可能出现虚假唤醒的场景,并说明如何通过代码逻辑来处理这种虚假唤醒,举例说明。
48.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

虚假唤醒场景

在Go语言中,条件变量的虚假唤醒指的是CondWait方法在没有调用CondSignalBroadcast方法时就返回了。这可能发生在操作系统线程调度的不确定性等情况下。例如,在高并发环境下,多个协程同时竞争资源,当系统资源紧张时,调度器可能会在没有明确信号的情况下将等待中的协程唤醒。

处理方式

为了处理虚假唤醒,需要在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条件,只有当readytrue时才会执行后续操作。Wait方法被调用时,协程会释放锁并等待信号,当收到信号(无论是正常信号还是虚假唤醒),Wait返回,然后再次检查ready条件。如果readyfalse,则继续等待;如果为true,则执行后续操作。