首次提交:初始化项目代码

This commit is contained in:
sunct
2026-07-31 15:18:32 +08:00
commit d6393266b0
193 changed files with 14287 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
package main
import (
"fmt"
"sync"
"time"
)
var (
queue []int // 共享队列(生产者-消费者模型)
cmu sync.Mutex // 保护队列的互斥锁
cond = sync.NewCond(&cmu) // 基于mu创建条件变量
cwg sync.WaitGroup
)
// 生产者:向队列添加数据
func producer(id int) {
defer cwg.Done()
for i := 0; i < 3; i++ {
cmu.Lock()
data := id*10 + i
queue = append(queue, data)
fmt.Printf("生产者%d: 生产数据%d(队列长度%d\n", id, data, len(queue))
cmu.Unlock()
cond.Signal() // 唤醒一个等待的消费者(通知队列非空)
time.Sleep(500 * time.Millisecond)
}
}
// 消费者:等待队列非空后消费数据
func consumer(id int) {
defer cwg.Done()
for i := 0; i < 2; i++ { // 限定消费次数,避免无限等待
cmu.Lock()
// 循环等待:避免虚假唤醒(被唤醒时条件可能仍不满足)
for len(queue) == 0 {
cond.Wait() // 释放mu并阻塞,被唤醒时重新获取mu
}
if len(queue) > 0 { // 确保队列不为空
data := queue[0]
queue = queue[1:]
fmt.Printf("消费者%d: 消费数据%d(剩余长度%d\n", id, data, len(queue))
}
cmu.Unlock()
}
}
func main() {
cwg.Add(2) // 2个生产者
go producer(0)
go producer(1)
cwg.Add(3) // 3个消费者
go consumer(0)
go consumer(1)
go consumer(2)
cwg.Wait()
fmt.Println("所有生产者和消费者完成")
}