2

私はこのような3つの同時ルーチンを持っています、

func Routine1() {

Print (value a, value b, value c)
Print (value a, value b, value c)
Print (value a, value b, value c)

}

func Routine2() {
Print (value e, value f, value g)
Print (value e, value f, value g)
Print (value e, value f, value g)
}
func Routine3() {
Print (value x, value y, value z)
Print (value x, value y, value z)
Print (value x, value y, value z)
}

func main() {
go Routine1(command12, response12, command13, response13)
go Routine2(command12, response12, command23, response23)
Routine3(command13, response13, command23, response23)
}

今私が直面している問題は、3つの同時ルーチンの結果として、printステートメントが正しく実行されない場合、全体を印刷しないことを意味する場合があり、別の印刷によって挿入されたものがある場合があります。たとえば、ルーチン1のPrint(値a、値b、値c)は、値a、値b、値gのような出力を提供します。ここで、値gはルーチン2によって挿入されます。誰かが私に提案できますか、どうすれば停止できますか?sync-mutexプロシージャを試しました。ただし、コードが長すぎて、正しい方法でロック解除を実行できない可能性があるため、デッドロックエラーが発生している可能性があります。誰かが私にそれらを簡単な方法で、またはよりリスクの少ないsync-mutex手順で実装する方法を提案できますか?

私のこの問題についての詳細はここで見つけることができます。

4

1 に答える 1

6

あなたが説明するように印刷することは不可分操作ではありません。ミューテックスを使用する代わりに、Goの方法を試してください。文字列を受け入れる各ゴルーチンにチャネルを渡します。何かを印刷したいときはいつでも、そのチャネルに文字列を送信するだけです。

別のゴルーチンは、そのチャネルから読み取るだけで、出力されたものをすべて出力します。このように、ロックの必要はありません。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2) // 2 routines we need to wait for.

    stdout := make(chan string)

    go routine1(&wg, stdout)
    go routine2(&wg, stdout)
    go printfunc(stdout)

    wg.Wait()

    close(stdout)
}

func routine1(wg *sync.WaitGroup, stdout chan<- string) {
    defer wg.Done()

    stdout <- "first print from 1"
    // do stuff
    stdout <- "second print from 1"
}

func routine2(wg *sync.WaitGroup, stdout chan<- string) {
    defer wg.Done()

    stdout <- "first print from 2"
    // do stuff
    stdout <- "second print from 2"
}

func printfunc(stdout <-chan string) {
    for {
        select {
        case str := <- stdout:
            fmt.Println(str)
        }
    }
}
于 2011-12-02T14:34:21.553 に答える