C ++ 20バリアに別々の到着と待機が存在するのはなぜですか?

アレックス・グテニエフ

C ++ 20にstd::barrierarrive_and_waitメソッドがあります。これは、ほとんどすべての同期バリア実装にある方法です。

ただし、別のともarriveありwaitます。なぜこれらの機能が存在するのですか?

ニコル・ボーラス

さて、ある種の同期されたタスクを実行しなければならないスレッドがたくさんあります。これらのタスクはフェーズにグループ化されます。1つのフェーズのタスクは前のフェーズのタスクによって生成されたデータを使用し、次のフェーズの作業を開始する前に、前のフェーズのすべての作業を実行する必要があります。前のフェーズのデータ​​を必要とする作業は、「同相」作業と呼ばれます。

ただし、実行する必要があるすべてが実際に前のフェーズのデータ​​を必要とするわけではないとしましょう。前のフェーズからのデータを読み取らない、スレッドが実行できる個々の作業項目がいくつかある可能性があります。これを「位相のずれた」作業と呼びましょう。

を呼び出す前にこのフェーズ外の作業を実行しようとするarrive_and_waitと、待機している実際の作業が完了していても、他のすべてのスレッドが何かを実行できないようにブロックされている可能性があります。同相作業と逆相作業のバランスによっては、パフォーマンスが大幅に無駄になる可能性があります。

したがって、スレッドが同相の作業を終了し、フェーズ外の作業を行う必要がある場合は、それが可能arriveです。これにより、他のすべてのスレッドも同相作業が終了した場合に解放される可能性があります。次に、スレッドは、次のフェーズから実行される作業と非同期になる可能性のある、フェーズ外の作業を処理することができます。フェーズ外の作業が完了すると、スレッドはwaitへの呼び出しによって生成されたトークンを処理できます。arrive次のフェーズが開始された場合、スレッドはブロックせずに戻ります。

実際、同相作業の量が逆相作業の量よりもはるかに少ない場合、このパターンは、スレッドがほとんどブロックされないことを意味します。バリアは、マルチスレッドのアトミック順序付け操作として機能するだけであり、ブロックする操作ではありません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

%とfmod()の両方がCに存在するのはなぜですか

分類Dev

C ++ 20で範囲を使用すると、パイプ演算子が機能しないのはなぜですか?

分類Dev

C#とJavaに「null」が存在するのはなぜですか?

分類Dev

C ++ 20でvolatileが非推奨になるのはなぜですか?

分類Dev

C ++ 20でvolatileが非推奨になるのはなぜですか?

分類Dev

C ++ 20レンジライブラリに独自の名前空間があるのはなぜですか?

分類Dev

Cがタグと識別子に別々の名前空間を持っているのはなぜですか?

分類Dev

await がスレッドの実行を停止し、結果が C# でのアクティブ化を待機しているのはなぜですか?

分類Dev

Cに矢印(->)演算子が存在するのはなぜですか?

分類Dev

`inline`キーワードがC ++に存在するのはなぜですか?

分類Dev

C#がrefとoutを区別するのはなぜですか?

分類Dev

「out」パラメーターが言語構造としてC#に存在するのはなぜですか?

分類Dev

C ++ 20でstd :: accumulateがconstexprにならないのはなぜですか?

分類Dev

C ++ 20のコンテナに.ssizeメンバー関数がないのはなぜですか?

分類Dev

なぜCには常に主な機能があるのですか?

分類Dev

C ++ 20で依存型の前に「typename」を指定する必要がないのはなぜですか?

分類Dev

MPIバリアを使用して致命的なエラーが発生するのはなぜですか[c ++]

分類Dev

`std :: reference_wrapper`がc ++ 17で非推奨になり、c ++ 20で削除されるのはなぜですか?

分類Dev

正規表現がC ++で機能しないのに、Pythonでは機能するのはなぜですか?

分類Dev

このコードスニペットがCとC ++で根本的に異なるアセンブリコードを生成するのはなぜですか?

分類Dev

C ++:int array [size]が機能するのはなぜですか?

分類Dev

GCCがC11atomic_loadのメモリバリアを取り除くことができるのはなぜですか?

分類Dev

C ++ 20がatomic <T>のTを制限するために `requires`を使用しないのはなぜですか?

分類Dev

アセンブリの1つのバージョンに存在するが、C#.NET3.5では別のバージョンには存在しないメソッドをオーバーライドする

分類Dev

C#7-非同期メソッドからこの待機可能な型を返すことができないのはなぜですか?

分類Dev

C ++アロケーターの概念に構築機能と破棄機能があるのはなぜですか?

分類Dev

同じ識別子のサイズがCとC ++で異なるのはなぜですか?

分類Dev

Task.WaitAllがすべてのタスクが完了するまで待機しないのはなぜですか?C#

分類Dev

HTTPS / SSLリクエストが実行されると、このC ++ ASIO、BEASTサーバーが不良状態になるのはなぜですか

Related 関連記事

  1. 1

    %とfmod()の両方がCに存在するのはなぜですか

  2. 2

    C ++ 20で範囲を使用すると、パイプ演算子が機能しないのはなぜですか?

  3. 3

    C#とJavaに「null」が存在するのはなぜですか?

  4. 4

    C ++ 20でvolatileが非推奨になるのはなぜですか?

  5. 5

    C ++ 20でvolatileが非推奨になるのはなぜですか?

  6. 6

    C ++ 20レンジライブラリに独自の名前空間があるのはなぜですか?

  7. 7

    Cがタグと識別子に別々の名前空間を持っているのはなぜですか?

  8. 8

    await がスレッドの実行を停止し、結果が C# でのアクティブ化を待機しているのはなぜですか?

  9. 9

    Cに矢印(->)演算子が存在するのはなぜですか?

  10. 10

    `inline`キーワードがC ++に存在するのはなぜですか?

  11. 11

    C#がrefとoutを区別するのはなぜですか?

  12. 12

    「out」パラメーターが言語構造としてC#に存在するのはなぜですか?

  13. 13

    C ++ 20でstd :: accumulateがconstexprにならないのはなぜですか?

  14. 14

    C ++ 20のコンテナに.ssizeメンバー関数がないのはなぜですか?

  15. 15

    なぜCには常に主な機能があるのですか?

  16. 16

    C ++ 20で依存型の前に「typename」を指定する必要がないのはなぜですか?

  17. 17

    MPIバリアを使用して致命的なエラーが発生するのはなぜですか[c ++]

  18. 18

    `std :: reference_wrapper`がc ++ 17で非推奨になり、c ++ 20で削除されるのはなぜですか?

  19. 19

    正規表現がC ++で機能しないのに、Pythonでは機能するのはなぜですか?

  20. 20

    このコードスニペットがCとC ++で根本的に異なるアセンブリコードを生成するのはなぜですか?

  21. 21

    C ++:int array [size]が機能するのはなぜですか?

  22. 22

    GCCがC11atomic_loadのメモリバリアを取り除くことができるのはなぜですか?

  23. 23

    C ++ 20がatomic <T>のTを制限するために `requires`を使用しないのはなぜですか?

  24. 24

    アセンブリの1つのバージョンに存在するが、C#.NET3.5では別のバージョンには存在しないメソッドをオーバーライドする

  25. 25

    C#7-非同期メソッドからこの待機可能な型を返すことができないのはなぜですか?

  26. 26

    C ++アロケーターの概念に構築機能と破棄機能があるのはなぜですか?

  27. 27

    同じ識別子のサイズがCとC ++で異なるのはなぜですか?

  28. 28

    Task.WaitAllがすべてのタスクが完了するまで待機しないのはなぜですか?C#

  29. 29

    HTTPS / SSLリクエストが実行されると、このC ++ ASIO、BEASTサーバーが不良状態になるのはなぜですか

ホットタグ

アーカイブ