goroutinesはマルチコアプロセッサでどのように動作しますか

神経:

私はGo言語の初心者なので、質問が非常に基本的なものである場合は失礼します。私は非常に単純なコードを書きました:

func main(){
    var count int // Default 0

    cptr := &count

    go incr(cptr)

    time.Sleep(100)

    fmt.Println(*cptr)
}

// Increments the value of count through pointer var
func incr(cptr *int) {
    for i := 0; i < 1000; i++ {
            go func() {
                    fmt.Println(*cptr)
                    *cptr = *cptr + 1
            }()
      }
    }

countの値は、ループの実行回数の1だけ増加する必要があります。以下のケースを検討してください。

ループは100回実行されます-> countの値は100です(ループが100回実行されるため、これは正しいことです)。

ループは> 510回実行されます->カウントの値は508または510のいずれかです。これは100000であっても発生します。

私はこれを8コアプロセッサマシンで実行しています。

cfstras:

まず、Go 1.5より前のバージョンでは、シングルプロセッサで実行され、システムコールをブロックするために複数のスレッドのみを使用します。GOMAXPROCSを使用してより多くのプロセッサを使用するようランタイムに指示しない限り

Go 1.5以降、GOMAXPROCSはCPUの数に設定されます。参照67

また、操作*cptr = *cptr + 1がアトミックであることは保証されていません。注意深く見ると、3つの操作に分けることができます。ポインタの逆参照による古い値のフェッチ、値の増分、ポインタアドレスへの値の保存です。

508/510を取得しているという事実は、ランタイムの魔法によるものであり、そのようにとどまるように定義されていません。同時実行操作の動作の詳細については、Goメモリモデルを参照してください
510未満の開始されたゴルーチンの正しい値を取得している可能性があります。これは、これらの値を下回る数値が(まだ)中断されていないためです。

一般に、実行しようとしていることは、どの言語でも推奨できず、同時実行を行う「実行」方法でもありません。:同期するためにチャネルを使用して、非常に良い例では、このコード徒歩共有メモリーて通信(むしろ共有メモリでの通信より)

これが私が何を意味するかを示すための小さな例です:バッファを1にしてチャネルを使用して現在の数を保存し、必要なときにチャネルからフェッチし、自由に変更して、他の人が使用できるように戻します。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Windows10のマルチコアプロセッサ上のQueryPerformanceCounterは不規則に動作します

分類Dev

test_and_set()命令はマルチプロセッサでどのように機能しますか?

分類Dev

マルチコアプロセッサのクロック速度を計算するにはどうすればよいですか?

分類Dev

Pythonマルチプロセッシングでは、子プロセスはどのようにして別の子プロセスを終了できますか?

分類Dev

マルチプロセッシングはコアとスレッドにどのように関連していますか?

分類Dev

Cプリプロセッサはマルチパスで動作していますか?

分類Dev

このカスタムプロセスをどのように並行して実行できますか?またはマルチコア?

分類Dev

コールバック関数はマルチプロセッシングmap_asyncでどのように機能しますか?

分類Dev

マルチプロセッサに割り当てられたアクティブなブロックセットの動作は何ですか?

分類Dev

JavaでマルチコアプロセッサをGZIPInputStreamで使用するにはどうすればよいですか?

分類Dev

Javaマルチスレッドプログラムはどのようにして複数のCPUコアを使用できますか?

分類Dev

gdbはどのようにマルチスレッドプロセスに接続しますか

分類Dev

gdbはどのようにマルチスレッドプロセスに接続しますか

分類Dev

JVMスレッドスケジューラはマルチプロセッサのスレッドをどのように制御しますか?

分類Dev

JVMスレッドスケジューラはマルチプロセッサのスレッドをどのように制御しますか?

分類Dev

マルチスレッド Kafka プロデューサーはどのように機能しますか?

分類Dev

Pythonマルチプロセッシングはどのように機能しますか?

分類Dev

マルチプロセッシングでPyCudaをどのように使用しますか?

分類Dev

どのようにJavaでのループで作業をマルチスレッド化しますか?

分類Dev

マルチラインスパンはブロックのように動作しますか?

分類Dev

マルチプロットモードでgnuplotマージンはどのように機能しますか?

分類Dev

LinuxでのPython3によるPython2マルチプロセッシングの呼び出しは、Windowsとは異なる動作をします

分類Dev

マイクロコードはどのようにプロセッサにロードされますか?

分類Dev

Fody NuGetパッケージは、コンパイルプロセスの最後にアセンブリをどのようにマージしますか?

分類Dev

バッチプログラミングでechoコマンドはどのように機能しますか

分類Dev

Linuxカーネルはどのようにしてプロセッサとコアに関する情報を取得しますか?

分類Dev

センチネルを使用したRedisは、スプリットブレイン後にどのように動作しますか?

分類Dev

GNOMEのコントロールセンター(v3)でコマンドラインから直接サブアプレットを起動するにはどうすればよいですか?

分類Dev

マルチスレッドプログラムはCでどのように機能しますか?

Related 関連記事

  1. 1

    Windows10のマルチコアプロセッサ上のQueryPerformanceCounterは不規則に動作します

  2. 2

    test_and_set()命令はマルチプロセッサでどのように機能しますか?

  3. 3

    マルチコアプロセッサのクロック速度を計算するにはどうすればよいですか?

  4. 4

    Pythonマルチプロセッシングでは、子プロセスはどのようにして別の子プロセスを終了できますか?

  5. 5

    マルチプロセッシングはコアとスレッドにどのように関連していますか?

  6. 6

    Cプリプロセッサはマルチパスで動作していますか?

  7. 7

    このカスタムプロセスをどのように並行して実行できますか?またはマルチコア?

  8. 8

    コールバック関数はマルチプロセッシングmap_asyncでどのように機能しますか?

  9. 9

    マルチプロセッサに割り当てられたアクティブなブロックセットの動作は何ですか?

  10. 10

    JavaでマルチコアプロセッサをGZIPInputStreamで使用するにはどうすればよいですか?

  11. 11

    Javaマルチスレッドプログラムはどのようにして複数のCPUコアを使用できますか?

  12. 12

    gdbはどのようにマルチスレッドプロセスに接続しますか

  13. 13

    gdbはどのようにマルチスレッドプロセスに接続しますか

  14. 14

    JVMスレッドスケジューラはマルチプロセッサのスレッドをどのように制御しますか?

  15. 15

    JVMスレッドスケジューラはマルチプロセッサのスレッドをどのように制御しますか?

  16. 16

    マルチスレッド Kafka プロデューサーはどのように機能しますか?

  17. 17

    Pythonマルチプロセッシングはどのように機能しますか?

  18. 18

    マルチプロセッシングでPyCudaをどのように使用しますか?

  19. 19

    どのようにJavaでのループで作業をマルチスレッド化しますか?

  20. 20

    マルチラインスパンはブロックのように動作しますか?

  21. 21

    マルチプロットモードでgnuplotマージンはどのように機能しますか?

  22. 22

    LinuxでのPython3によるPython2マルチプロセッシングの呼び出しは、Windowsとは異なる動作をします

  23. 23

    マイクロコードはどのようにプロセッサにロードされますか?

  24. 24

    Fody NuGetパッケージは、コンパイルプロセスの最後にアセンブリをどのようにマージしますか?

  25. 25

    バッチプログラミングでechoコマンドはどのように機能しますか

  26. 26

    Linuxカーネルはどのようにしてプロセッサとコアに関する情報を取得しますか?

  27. 27

    センチネルを使用したRedisは、スプリットブレイン後にどのように動作しますか?

  28. 28

    GNOMEのコントロールセンター(v3)でコマンドラインから直接サブアプレットを起動するにはどうすればよいですか?

  29. 29

    マルチスレッドプログラムはCでどのように機能しますか?

ホットタグ

アーカイブ