go|sync系列:WaitGroup、Once、Cond
warning:
这篇文章距离上次修改已过437天,其中的内容可能已经有所变动。
以下是针对Go语言中的sync包中的WaitGroup、Once和Cond三个组件的简单示例代码。
WaitGroup示例:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 确保每个goroutine结束时都调用Done
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 为每个goroutine增加计数
go worker(i, &wg)
}
wg.Wait() // 等待所有goroutine完成
}Once示例:
package main
import (
"fmt"
"sync"
)
func main() {
var once sync.Once
var count int
increment := func() {
count++
fmt.Println("Increment called:", count)
}
for i := 0; i < 10; i++ {
go func() {
once.Do(increment)
}()
}
// 等待goroutines完成
time.Sleep(time.Second)
}Cond示例:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var cond sync.Cond
cond.L = new(sync.Mutex)
isReady := false
waitForReady := func() {
cond.L.Lock()
for !isReady {
fmt.Println("Waiting for ready signal...")
cond.Wait()
}
fmt.Println("Received ready signal.")
cond.L.Unlock()
}
sendReadySignal := func() {
cond.L.Lock()
isReady = true
cond.Signal()
fmt.Println("Sent ready signal.")
cond.L.Unlock()
}
go waitForReady()
time.Sleep(time.Second) // 确保goroutine有足够的时间等待
go sendReadySignal()
// 等待goroutines完成
time.Sleep(2*time.Second)
}这些示例代码展示了如何使用sync包中的WaitGroup、Once和Cond来同步并发的goroutines。WaitGroup用于等待一组goroutines完成;Once确保某个函数只执行一次;而Cond用于在满足特定条件时唤醒等待的goroutines。
评论已关闭