用Go语言交替执行关键部分

时间:2013-09-06 09:29:18

标签: concurrency go goroutine

我有两个例程:

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

1 个答案:

答案 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
}