我有两个例程:
func f1 {
... some code
// critical section 1 (CS1)
... critical section code
// end criticla section 1
... more code
}
func f2 {
... some code
// critical section 2 (CS2)
... critical section code
// end criticla section 2
... more code
}
func main() {
go f1()
go f2()
}
确保这些例程中的关键部分始终交替执行的正确方法是什么? 换句话说,CS1应该只在CS2之后执行,反之亦然:CS1,CS2,CS1,CS2,CS1等。
答案 0 :(得分:4)
如果你在不同的goroutine中运行这些功能,我建议使用双通道。这就像传递一点点bool-ball。每个功能都有一个他们收听的频道,以及一个关键部分完成后传递球的另一个频道。然后你可以肯定,无论何时调用它们,它们总是交替运行。
此模式还允许您使用f3,f4 ......扩展循环。
package main
func f1(do chan bool, next chan bool) {
//... some code
<-do // Waits for the ball
// critical section 1 (CS1)
//... critical section code
// end criticla section 1
next <- true // Pass on the ball to the next function
//... more code
}
func f2(do chan bool, next chan bool) {
//... some code
<-do
// critical section 2 (CS2)
//... critical section code
// end criticla section 2
next <- true
//... more code
}
func main() {
cf1 := make(chan bool, 1)
cf2 := make(chan bool, 1)
cf1 <- true // Let cf1 start with the ball
go f1(cf1, cf2)
go f2(cf2, cf1)
// Wait here, otherwise it will just exit
}