4

さて、私はある種のキューで作業しようとしています。std :: queueからデータをポップするための専用のIOスレッドがありますが、問題は、 100%のCPU定数チェックを防ぐためにSleep()を使用していることです。そしてもちろん、std::queueにアイテムを追加する他のスレッド。

スレッドが休止状態になり、std :: queueが空でない場合にのみ開始するようにイベントを作成するにはどうすればよいですか?

IOスレッド

Sleep(100);
while (!myqueue.empty())
  {
     //process data FIFO
     myqueue.pop(); //pop out and continue
  }

どうもありがとうございました!ああ、これはc++11またはc++03の場合、問題ではありません-Windowsの場合。

4

3 に答える 3

7

std::queueスレッドとはまったく関係ありません。まったく。その.empty()メンバーはスレッドセーフではありません (再入可能のみ)! 同じことが他のすべてのメンバーにも当てはまります。したがって、複数のスレッドが異なるキューを好きなように使用できますが、一度に 1 つのスレッドだけが各インスタンスで何かを実行できます。

C++11 または C++03 は非常に重要です。C++11 ではスレッド同期プリミティブが定義されていますが、C++03 では定義されておらず、OS API を使用する必要があります。

C++11 では、std::condition_variable.

C++03 では、Boost.Thread (C++11 とほとんど互換性があります) EventsまたはSemaphoresに関心があります。

どちらの場合でも、std::queue::push()std::queue::pop()自体は相互排除によって保護する必要があります。Windows API ではCritical Sectionstd::condition_variableを使用します。std::mutex

Windows では、C++11 クラスは Visual Studio 2012 および Windows 8 でのみ使用できます。古いコンパイラでは、Boost (利点は、移植性があることです) またはネイティブ API を使用します。

于 2013-02-04T12:01:51.983 に答える
1

「条件変数」が必要です。スレッドがキューに何かを置くたびに、条件変数を待機しているスレッドに「通知」します。キューからのイベントを消費するスレッドは、条件変数で待機します。誰かが条件変数を介して通知するまで、スリープ状態です。

Boostには素晴らしい実装があります:http ://www.boost.org/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref

キューへのアクセスがスレッドセーフであることを確認するためにロックを使用していますね。

于 2013-02-04T12:00:55.657 に答える