为了账号安全,请及时绑定邮箱和手机立即绑定

Go 语言中临界区的交替执行

Go 语言中临界区的交替执行

Go
尚方宝剑之说 2021-06-24 15:19:39
我有两个 go 例程: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 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

如果你在不同的 goroutines 中运行这些函数,我会建议双通道。这就像传递一个小布尔球。每个函数都有一个他们监听的通道,以及另一个通道,一旦关键部分完成,他们就会将球传给另一个通道。那么您可以确定,无论何时调用它们,它们始终会交替运行。


此模式还允许您使用 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

}


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信