面试题答案
一键面试- 原理:
sync.Cond
依赖于一个sync.Locker
(通常是sync.Mutex
)。生产者和消费者通过这个条件变量来同步。生产者在生产数据后,通知等待在条件变量上的消费者。消费者根据不同条件决定是否消费数据,如果条件不满足则等待在条件变量上。
- 核心代码片段:
package main
import (
"fmt"
"sync"
)
type Data struct {
// 数据结构定义
}
var (
dataQueue []Data
mu sync.Mutex
cond = sync.NewCond(&mu)
)
// 生产者函数
func producer(id int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 10; i++ {
mu.Lock()
newData := Data{}
dataQueue = append(dataQueue, newData)
fmt.Printf("Producer %d produced data\n", id)
cond.Broadcast()
mu.Unlock()
}
}
// 消费者函数
func consumer(id int, wg *sync.WaitGroup) {
defer wg.Done()
for {
mu.Lock()
for len(dataQueue) == 0 {
cond.Wait()
}
// 这里可以添加不同的消费条件判断
data := dataQueue[0]
dataQueue = dataQueue[1:]
fmt.Printf("Consumer %d consumed data\n", id)
mu.Unlock()
}
}
func main() {
var wg sync.WaitGroup
numProducers := 3
numConsumers := 5
for i := 0; i < numProducers; i++ {
wg.Add(1)
go producer(i, &wg)
}
for i := 0; i < numConsumers; i++ {
wg.Add(1)
go consumer(i, &wg)
}
wg.Wait()
}
在上述代码中:
producer
函数生产数据并通过cond.Broadcast()
通知所有等待的消费者。consumer
函数在dataQueue
为空时通过cond.Wait()
等待,当被通知且dataQueue
有数据时消费数据。可以在消费数据前添加不同的条件判断逻辑。