GO 利用 sync 库实现 Barrier

来源:互联网 发布:指纹解锁软件 编辑:程序博客网 时间:2024/06/01 10:03

GO Barrier


Barrier 用于多个线程完成状态的同步。在linux的系统库中有相关的实现,在 pthread.h 中有函数声明。在golang的标准库中还没有相关的实现。下面利用sync标准库实现个简单的barrier。

实现


----------$GOPATH/src/barrier/barrier.go-----------package barrierimport (    "sync")type Barrier struct {    curCnt int    maxCnt int    cond   *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.WaitGroup    for 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()}
0 0
原创粉丝点击