我正在尝试使用“同步”中的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)
}
答案 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。