面试题答案
一键面试基本步骤
- 创建条件变量:使用
sync.Cond
类型,通过sync.NewCond
函数创建,该函数接受一个sync.Locker
作为参数,通常是sync.Mutex
。 - 获取锁:在使用条件变量的操作前后,需要通过
sync.Locker
获取和释放锁,以确保数据的一致性和避免竞态条件。 - 等待条件:使用
Cond.Wait
方法,该方法会释放锁并阻塞当前goroutine,直到其他goroutine调用Cond.Signal
或Cond.Broadcast
唤醒它,唤醒后会重新获取锁。 - 通知条件:使用
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秒后设置ready
为true
并通过Broadcast
唤醒第一个goroutine,第一个goroutine被唤醒后继续执行。