0

各コアに 1 つのスレッドが割り当てられており、システム スレッドが独自のセットにブロックされているため、CPU ホグであることは気にしません。私の理解では、ミューテックスは他のタスクが実行されるときに使用されますが、この場合は重要ではないため、単一のプロデューサーのように、値がゼロ以外になるのを待機するメモリ内のアドレスでコンシューマー スレッド ループを使用することを検討しています。 TCP_NONBLOCK を設定して recv()ing をループしているスレッドは、情報をデポジットしたばかりで、現在はゼロではありません。

私の状況を考えると、私の移植は賢明なものですか、それとも他のタスクが実行されなくてもミューテックスまたはカスタム割り込みを使用する必要がありますか?

4

2 に答える 2

2

@ugoren によるポイントと他のユーザーによるコメントに加えて:

ビジー待機とコアの書き込みの有効なユースケースがある場合でも、これは確かにまれですが、次のことを行う必要があります。

  • スレッド間で共有されるデータを保護します。これがロックの出番ですmutual exclusion。複雑な共有データ構造にアクセスするときに必要です。人々はここでアルゴリズムを調べる傾向がありますlock-freeが、これらは明らかではなく、エラーが発生しやすく、依然として深い黒魔術と​​見なされています. 並行性についてしっかりと理解するまで、これらを試してはいけません。
  • 変更された状態についてスレッドに通知します。これは、conditional variablesまたはモニターを使用する場所です。eventfd(2)たとえば Linux では、他の方法もあります。

あなたが思っているよりもはるかに難しいことを示すためのいくつかのリンクを次に示します。

于 2012-06-12T13:16:31.833 に答える
2

ビジー待機を使用すると、レイテンシが短くなり、パフォーマンスが向上する場合があります。

他のスレッドに CPU を使用させることは、それを行わない明らかな理由ですが、他にもあります。

  1. より多くの電力を消費します。アイドル状態の CPU は低電力状態になり、消費が大幅に削減されます。消費電力はデータセンターの主要な問題であり、深刻なアプリケーションでは電力を少し無駄にする必要があります。

  2. コードが仮想マシンで実行される場合 (そして、最近はすべてが仮想化されています)、マシンは他のマシンと CPU を競合します。100% の CPU を消費すると、残りが少なくなり、本当に必要なときにハイパーバイザーがマシンに与える CPU が少なくなる可能性があります。

  3. よほどの理由がない限り、常に主流の方法に固執する必要があります。この場合はselector poll(or epoll) を使うのが主流です。これにより、必要に応じて待機中に他のことを行うことができ、CPU 時間を無駄にしません。パフォーマンスの差は、ビジー待機を正当化するのに十分な大きさですか?

于 2012-06-12T12:13:27.110 に答える