Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我正在尝试使用“同步”中的Broadcast()函数,但是它并没有按照我希望的那样工作。

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

我该如何运作?

这就是docs中编写的所有内容。**广播唤醒所有等待* 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)
}

最佳答案

如评论中所述,广播调用可能发生在goroutines到达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()
从文档:



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

关于go - Golang中的Broadcast(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51371587/

10-11 16:09