Golang中的Broadcast()

时间:2018-07-17 00:21:10

标签: go synchronization

我正在尝试使用“同步”中的Broadcast()函数,但是它无法按我的意愿工作。

我需要锁定所有goroutine的执行,然后只需通过调用C.Broadcast()释放它们并让它们执行即可,但这没有发生。

我如何使其工作?

这就是文档中写的所有内容。**广播唤醒所有等待* sync.Cond的goroutine。 **

这是我要制作的代码:

package main

import (
    "fmt"
    "sync"
    "time"
)

var M sync.Mutex = sync.Mutex{}
var C *sync.Cond = sync.NewCond(&M)

func ff(){
    M.Lock()
    C.Wait()
    fmt.Println("broadcasting")
    M.Unlock()
}

func main() {

    num := [6]int{}

    for _, _= range num {
        go ff()
    }  

    M.Lock()
    C.Broadcast()
    M.Unlock()

    fmt.Println("done")
    time.Sleep(5 * time.Second)
}

1 个答案:

答案 0 :(得分:2)

如评论中所述,广播广播可能是在goroutine到达C.Wait()

之前发生的

您可以使用sync软件包的另一部分来解决此问题。一个WaitGroup

package main

import (
    "fmt"
    "sync"
    "time"
)

var M sync.Mutex
var C *sync.Cond = sync.NewCond(&M)
var wg sync.WaitGroup // create a wait group

func ff(){
    wg.Done() // tell the group that one routine has started
    M.Lock()
    C.Wait()
    fmt.Println("broadcasting")
    M.Unlock()
}

func main() {

    num := [6]int{}

    wg.Add(len(num)) // tell the group you are waiting for len(num) goroutines to start
    for _, _= range num {
        go ff()
    }  

    M.Lock()
    wg.Wait() // wait for all the routines to start
    C.Broadcast()
    M.Unlock()

    fmt.Println("done")
    time.Sleep(5 * time.Second)
}

也;调用M sync.Mutex

时并不一定要对C.Broadcast()保持锁定

从文档中

  

允许但不要求呼叫者在通话过程中保持c.L。

https://golang.org/pkg/sync/#Cond