本文主要是介绍GO 利用 sync 库实现 Barrier,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GO Barrier
Barrier 用于多个线程完成状态的同步。在linux的系统库中有相关的实现,在 pthread.h 中有函数声明。在golang的标准库中还没有相关的实现。下面利用sync标准库实现个简单的barrier。
实现
----------$GOPATH/src/barrier/barrier.go-----------
package barrierimport ("sync"
)type Barrier struct {curCnt intmaxCnt intcond *sync.Cond
}func NewBarrier(maxCnt int) *Barrier {mutex := new(sync.Mutex)cond := sync.NewCond(mutex)return &Barrier{curCnt: maxCnt, maxCnt: maxCnt, cond: cond}
}func (barrier *Barrier) BarrierWait() {barrier.cond.L.Lock()if barrier.curCnt--; barrier.curCnt > 0 {barrier.cond.Wait()} else {barrier.cond.Broadcast()barrier.curCnt = barrier.maxCnt}barrier.cond.L.Unlock()
}
测试
package mainimport ("fmt""sync""barrier"
)func main() {fmt.Println("Hello World!")barrier := barrier.NewBarrier(3)var wg sync.WaitGroupfor i := 0; i < 3; i++ {wg.Add(1)go func() {defer wg.Done()fmt.Println("A")barrier.BarrierWait()fmt.Println("B")barrier.BarrierWait()fmt.Println("C")}()}wg.Wait()
}
这篇关于GO 利用 sync 库实现 Barrier的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!