このGolangコードでデッドロックが発生するのはなぜですか?

Long Pham:

私はGolangにかなり慣れていません。練習のために次のコードを書き、デッドロックの実行時エラーメッセージに遭遇しました。

package main

import (
    "fmt"
)

func system(WORKERS int) {
    fromW := make(chan bool)
    toW := make(chan bool)
    for i := 0; i != WORKERS; i++ {
        go worker(toW, fromW)
    }
    coordinator(WORKERS, fromW, toW)
}

func coordinator(WORKERS int, in, out chan bool) {
    result := true
    for i := 0; i != WORKERS; i++ {
        result =  result && <-in
    }
    for i := 0; i != WORKERS; i++ {
        out <- result
    }
    fmt.Println("%t", result)
}

func worker(in, out chan bool) {
    out <- false
    <-in
}

func main() {
    system(2)
}

ただし、19行目の&&のオペランドを入れ替えると、

result =  <-in && result,

コードはエラーメッセージを返さずに適切に機能します。この動作をどのように説明できますか?ここで何か不足していますか?私が使用しているOSはWindows 10で、Golangのバージョンは1.8.3です。

事前にどうもありがとうございました。

コンスタンティンS.パン:

ここわかるよう、の右のオペランド&&は条件付きで評価されます。

これは、がtrueの場合にresult = result && <-inのみ評価さ<-inれること意味しresultます。したがって、クードリネーターfalseはそのチャネルから1つだけを読み取り、他のワーカーからのメッセージの読み取りをスキップします。&&場所のオペランドを切り替える<-inと、は毎回評価され、デッドロックが解消されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

golangチャネルでデッドロックエラーが発生するのはなぜですか?

分類Dev

なぜここでデッドロックが発生するのか

分類Dev

この特定のWinFormsアプリでデッドロックが発生するのはなぜですか?

分類Dev

タイマー停止でデッドロックエラーが発生するのはなぜですか?

分類Dev

ここでデッドロックが発生しないのはなぜですか?

分類Dev

なぜGoでデッドロックが発生するのですか?

分類Dev

このコードでデッドロックが発生しますか?

分類Dev

デッドロックが発生しないのはなぜですか?

分類Dev

Goのselectステートメントの外に条件を移動すると、このデッドロックが発生するのはなぜですか

分類Dev

Java:スレッドが2つあるこの単純な例でデッドロックが発生しないのはなぜですか

分類Dev

デプロイされたコードの特定のリンクをクリックすると500エラーが発生するのはなぜですか?

分類Dev

暗黙のロックでデッドロックが発生しないのはなぜですか?

分類Dev

dispatch_onceでデッドロックが発生するのはなぜですか?

分類Dev

ロックと条件を使用して、Java のこのプロデューサー/コンシューマーでデッドロックが発生するのはなぜですか?

分類Dev

Windowsサービスの非同期でブロックするとデッドロックが発生するのはなぜですか?

分類Dev

このロックフリースタッククラスのノードを「削除」すると、競合状態が発生するのはなぜですか?

分類Dev

この生産者/消費者コードでデッドロックが発生するのはいつですか

分類Dev

このコードでInputMismatchExceptionが発生するのはなぜですか?

分類Dev

このコードでJavaNoSuchElement例外が発生するのはなぜですか?

分類Dev

このコードでJsonReaderExceptionが発生するのはなぜですか?

分類Dev

このコードでIllegalMonitorStateExceptionが発生するのはなぜですか?

分類Dev

このコードで「NotSupportedException」が発生するのはなぜですか?

分類Dev

この Python コードで KeyError が発生するのはなぜですか?

分類Dev

このMPI_Bcast関連のコードがデッドロックしないのはなぜですか?

分類Dev

条件変数のミューテックスを再利用するとデッドロックが発生するのはなぜですか?

分類Dev

この再帰コードの場合、Python 2.7ではスタックオーバーフローエラーが発生しないのに、3.5では発生するのはなぜですか?

分類Dev

以下のコードを実行すると、スタックオーバーフローエラーが発生するのはなぜですか?

分類Dev

このC ++コードで「アクセス違反」が発生するのはなぜですか

分類Dev

MouseAdapterのgetSourceメソッドからこのエラーが発生するのはなぜですか?

Related 関連記事

  1. 1

    golangチャネルでデッドロックエラーが発生するのはなぜですか?

  2. 2

    なぜここでデッドロックが発生するのか

  3. 3

    この特定のWinFormsアプリでデッドロックが発生するのはなぜですか?

  4. 4

    タイマー停止でデッドロックエラーが発生するのはなぜですか?

  5. 5

    ここでデッドロックが発生しないのはなぜですか?

  6. 6

    なぜGoでデッドロックが発生するのですか?

  7. 7

    このコードでデッドロックが発生しますか?

  8. 8

    デッドロックが発生しないのはなぜですか?

  9. 9

    Goのselectステートメントの外に条件を移動すると、このデッドロックが発生するのはなぜですか

  10. 10

    Java:スレッドが2つあるこの単純な例でデッドロックが発生しないのはなぜですか

  11. 11

    デプロイされたコードの特定のリンクをクリックすると500エラーが発生するのはなぜですか?

  12. 12

    暗黙のロックでデッドロックが発生しないのはなぜですか?

  13. 13

    dispatch_onceでデッドロックが発生するのはなぜですか?

  14. 14

    ロックと条件を使用して、Java のこのプロデューサー/コンシューマーでデッドロックが発生するのはなぜですか?

  15. 15

    Windowsサービスの非同期でブロックするとデッドロックが発生するのはなぜですか?

  16. 16

    このロックフリースタッククラスのノードを「削除」すると、競合状態が発生するのはなぜですか?

  17. 17

    この生産者/消費者コードでデッドロックが発生するのはいつですか

  18. 18

    このコードでInputMismatchExceptionが発生するのはなぜですか?

  19. 19

    このコードでJavaNoSuchElement例外が発生するのはなぜですか?

  20. 20

    このコードでJsonReaderExceptionが発生するのはなぜですか?

  21. 21

    このコードでIllegalMonitorStateExceptionが発生するのはなぜですか?

  22. 22

    このコードで「NotSupportedException」が発生するのはなぜですか?

  23. 23

    この Python コードで KeyError が発生するのはなぜですか?

  24. 24

    このMPI_Bcast関連のコードがデッドロックしないのはなぜですか?

  25. 25

    条件変数のミューテックスを再利用するとデッドロックが発生するのはなぜですか?

  26. 26

    この再帰コードの場合、Python 2.7ではスタックオーバーフローエラーが発生しないのに、3.5では発生するのはなぜですか?

  27. 27

    以下のコードを実行すると、スタックオーバーフローエラーが発生するのはなぜですか?

  28. 28

    このC ++コードで「アクセス違反」が発生するのはなぜですか

  29. 29

    MouseAdapterのgetSourceメソッドからこのエラーが発生するのはなぜですか?

ホットタグ

アーカイブ