- 基本思路:
- 使用
sync.Cond
和一个计数器来实现Barrier。sync.Cond
依赖于一个sync.Mutex
,通过这个互斥锁来保护共享状态(计数器)。
- 每个goroutine在到达Barrier点时,获取互斥锁,递减计数器。如果计数器不为0,就等待在
Cond
上;当计数器减到0时,说明所有goroutine都已到达,通过Cond
的Broadcast
方法唤醒所有等待的goroutine。
- 伪代码:
package main
import (
"fmt"
"sync"
)
func main() {
const N = 3
var wg sync.WaitGroup
var mu sync.Mutex
cond := sync.NewCond(&mu)
count := N
for i := 0; i < N; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
mu.Lock()
count--
if count > 0 {
cond.Wait()
} else {
cond.Broadcast()
}
mu.Unlock()
// 所有goroutine都到达后执行的逻辑
fmt.Printf("Goroutine %d continues after barrier\n", id)
}(i)
}
wg.Wait()
}