2

私は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

関数を異なるゴルーチンで実行している場合は、デュアル チャネルをお勧めします。それは小さなばかげたボールを渡すようなものです。各関数には、リッスンするチャネルと、クリティカル セクションが完了したときにボールを渡す別のチャネルがあります。そうすれば、いつ呼び出されても、常に交互に実行されることを確認できます。

このパターンでは、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 に答える