2
boost::condition_variable cond;
boost::mutex mut;
bool ready = false;

void consumer() {
    boost::mutex::scoped_lock lock(mut);
    while (!ready) {
         cond.wait(lock);
    }
}

void producer() {
    boost::mutex::scoped_lock lock(mut);
    ready = true;
    cond.notify_all();
    boost::this_thread::sleep(boost::posix_time::seconds(4));
}

上記のコードを参照してください。実際には、notify_all() を呼び出した後、プロデューサー スレッドを 4 秒間スリープさせます。ただし、コンシューマ スレッドは実際には 4 秒後に起動されます。では、どうすればこれを回避し、notify_all() を呼び出した直後に 4 秒間のスリープにもかかわらず、コンシューマ スレッドを起動することができますか。前もって感謝します。

4

2 に答える 2

3

それはboost::mutex :: scoped_lock lock(mut);と関係があります。プロデューサーで。スコープはスリープ後に終了するため、ミューテックスはスリープ後にのみ解放されます。

scoped_lockを保持したい場合は、それを試してください。

void producer() {
  {
    boost::mutex::scoped_lock lock(mut);
    ready = true;
    cond.notify_all();
  }
  boost::this_thread::sleep(boost::posix_time::seconds(4));
}
于 2012-07-12T09:40:24.457 に答える
1

スコープ ロックは、関数スコープが終了したときにのみ解放されます。コンシューマーは、実行を継続する前に実際にロックを再取得する必要があるため、ウェイクアップするように通知したとしても、プロデューサーがロックを解放するまでブロックされます。

@Clement によって提案されたソリューションを使用してロック スコープを縮小するか、手動でロックを解除できる別のタイプのロックを使用します。

于 2012-07-12T09:43:39.567 に答える