2

無限ループで実行されている 5 つのスレッドがあります。

そのうちの 2 つは、キューが空でない場合にメッセージを送信します。

そのうちの 4 つは 5 分以内にハートビートを送信し続けます。

そのうちの 1 つは、別のソースからデータを要求することです。

CPU を 100% 使用すると、そのウィンドウで他のアプリケーションを使用できなくなります。ウィンドウ全体が非常に遅くなります。

編集:WaitOneの後にスリープを置くことはできますか?

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);

ZeroMQ であるsubscriber.Recv()の後にスリープを置くことはできますか?

Recv() がない場合はすべてのスレッドをスリープ状態にしますが、client.Send のみを持つリアルタイム データフィード スレッドにあえてスリープ状態にしないスレッドが 1 つあります。スレッドが 1 つだけで 100% になりますか?

4

3 に答える 3

4

Q: プログラムが 100% CPU を使用しないようにする方法は?

A: ビジー ループを作成しないでください!!!!

ブロッキングは良いです。「やるべきことがあるまでブロックする」方法はたくさんあります。アラーム信号またはタイマーの使用 (貧弱ですが、確実な改善)、タイムアウト付きのソケット読み取りの実行 (ネットワーク ソケットで通知された場合)、またはタイムアウト付きの Windows イベント オブジェクトの使用が含まれます。

他のすべてに失敗した場合は、いつでも「Sleep()」を使用できます。「スリープ」を回避できる場合は、使用しないことをお勧めします。ほとんどの場合、はるかに優れた設計戦略があります。ただし、100% の CPU ビジー ループを回避できます ; )

=======================================

補遺: あなたはいくつかのコードを投稿しました (ありがとう!)

xxx.WaitOne() を使用しています。

WaitOne() (ブロッキング呼び出し) をタイムアウト付きで使用するだけです。これは理想的な解決策です。ビジー ループも、「スリープ」も必要ありません。

http://msdn.microsoft.com/en-us/library/aa332441%28v=vs.71%29.aspx

于 2013-07-17T08:55:44.043 に答える