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。 **
这是我要使工作的代码:
还;调用
从文档:
https://golang.org/pkg/sync/#Cond
想改善这个问题吗?更新问题,以便将其作为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