以下のような 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] をプロセス [番号] に送信するなど、別の印刷によって挿入されるものがあります)。 ]))。これを管理する方法を教えてくれる人はいますか?