0

以下のような 3 つの同時実行ルーチンがあります。

func Routine1() {
    mutex1.Lock()

    do something

    mutex2.Lock()
    mutex3.Lock()
    send int to routine 2
    send int to routine 3
   * Print Something *
    mutex2.Unlock()
    mutex3.Unlock()

    receive ints
    do something 

    mutex2.Lock()
    mutex3.Lock()
    send int to routine 2
    send int to routine 3
    Print Something
    mutex2.Unlock()
    mutex3.Unlock()

    do something
    receive ints
    mutex1.Unlock()
    wg.Done()
}

func Routine2() {
    mutex2.Lock()

    do something

    mutex1.Lock()
    mutex3.Lock()
    send int to routine 1
    send int to routine 3
    Print Something
    mutex1.Unlock()
    mutex3.Unlock()

    do something
    receive ints

    mutex1.Lock()
    mutex3.Lock()
    send int to routine 1
    send int to routine 3
    Print Something
    mutex1.Unlock()
    mutex3.Unlock()

    do something
    receive ints
    mutex2.Unlock()
    wg.Done()
}

func Routine3() {
// same structure as routine 1 & 2
}
func main() {
wg.Add(3)
go Routine1()
go Routine2()
Routine3()
wg.Wait()
}

この論理コードは、毎回デッドロック状態を引き起こします。実際に実行すると、ルーチン1のprint文(*印の間の文)だけを何度も実行するだけで(私のprint文は1つだけですが)、デッドロックエラーが発生します。コードロジックの何が問題なのか、誰でも教えてもらえますか。ありがとう。

注意。詳細については、コードがhttp://play.golang.org/p/pW6aXryUaKにあり、行番号 290 のみが実行されています。エラーを含まない元のコードは、play.golang.org/p/UL3rj8DJRk にあります。それらにロックとロック解除を追加するだけです。ありがとう。

別のポイントを追加したい: play.golang.org/p/UL3rj8DJRk のコードでは、次のようなさまざまな print ステートメントの出力を見つけることができます。 ]。ただし、3 つの同時実行ルーチンの結果として、print ステートメントが適切に実行されないことがあります (つまり、全体が印刷されないことを意味します。プロセス [番号] がプロセス [番号] で [int] をプロセス [番号] に送信するなど、別の印刷によって挿入されるものがあります)。 ]))。これを管理する方法を教えてくれる人はいますか?

4

1 に答える 1

1

投稿されたコードには十分な情報が含まれていないため、デッドロックの原因を特定することはできません。

ロックを取得する順序が原因である可能性があります。または、バッファリングされていない Go チャネルの使用が原因である可能性があります。

完全な Go ソース コードを投稿するまで、質問に答える方法はありません。

コードについてさらに詳しく説明する必要がある場合は、おそらくgolang-nutsに投稿する必要があります。

于 2011-12-02T08:41:40.787 に答える