2

我有两个套路:

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 等。

4

1 回答 1

4

如果您在不同的 goroutine 中运行这些功能,我建议您使用双通道。这就像传递一个小布尔球。每个函数都有一个他们监听的频道,以及一个他们在关键部分完成后传球的频道。那么你就可以确定,无论何时调用它们,它们总是交替运行。

此模式还允许您使用 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
}
于 2013-09-06T09:45:50.830 回答