【问题标题】:Alternate execution of critical sections in Go languageGo语言中临界区的交替执行
【发布时间】:2013-09-06 09:29:18
【问题描述】:

我有两个 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 等。

【问题讨论】:

    标签: concurrency go goroutine


    【解决方案1】:

    如果你在不同的 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
    }
    

    【讨论】:

    • 这似乎是在 Go 中的惯用方式。谢谢。
    猜你喜欢
    • 2021-12-23
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多