MST
星途 面试题库

面试题:Go语言中条件变量如何实现线程同步

请简述在Go语言中使用条件变量实现线程同步的基本步骤,并给出一个简单示例代码,说明如何通过条件变量来协调多个goroutine的执行顺序。
40.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

基本步骤

  1. 创建条件变量:使用sync.Cond类型,通过sync.NewCond函数创建,该函数接受一个sync.Locker作为参数,通常是sync.Mutex
  2. 获取锁:在使用条件变量的操作前后,需要通过sync.Locker获取和释放锁,以确保数据的一致性和避免竞态条件。
  3. 等待条件:使用Cond.Wait方法,该方法会释放锁并阻塞当前goroutine,直到其他goroutine调用Cond.SignalCond.Broadcast唤醒它,唤醒后会重新获取锁。
  4. 通知条件:使用Cond.Signal方法唤醒一个等待的goroutine,或者使用Cond.Broadcast方法唤醒所有等待的goroutine。

示例代码

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var mu sync.Mutex
    cond := sync.NewCond(&mu)
    ready := false

    // 第一个goroutine
    go func() {
        mu.Lock()
        for!ready {
            cond.Wait()
        }
        fmt.Println("第一个goroutine 开始执行")
        mu.Unlock()
    }()

    // 第二个goroutine
    go func() {
        time.Sleep(2 * time.Second)
        mu.Lock()
        ready = true
        fmt.Println("第二个goroutine 设置条件为 true")
        cond.Broadcast()
        mu.Unlock()
    }()

    time.Sleep(3 * time.Second)
}

在上述示例中,第一个goroutine等待ready条件为true,第二个goroutine在2秒后设置readytrue并通过Broadcast唤醒第一个goroutine,第一个goroutine被唤醒后继续执行。