0

私は C++ でサービスを作成していますが、一定時間スリープする必要があるスレッドがいくつかあります。

これまでのところうまくboost::this_thread::sleep_for機能していますが、中断が必要です (信号の停止など)。Boost には がありませんcancellation_token。これまでのところ、次のようなものがあります。

boost::mutex _waiting_mutex;
boost::condition_variable _waiting_cv;

void wait(const boost::chrono::duration& timeout)
{
    boost::unique_lock<boost::mutex> lk(_waiting_mutex);
    _waiting_cv.wait_for(lk, timeout); 
}

void signal_termination()
{
    _waiting_cv.notify_all();
}

これは、1 つのスレッド (5 秒間、またはsignal_termination()が呼び出されるまでスリープする) ではうまく機能しますが、複数のスレッドではうまく機能しません。

このunique_lockを克服するには? 最大スレッド数のセマフォを導入する必要がありますか?

C# では、ManualResetEvent.

4

1 に答える 1

1

複数のスレッドでどのようにテストしたかはわかりませんが、間違った結果が得られました。条件変数 wait() または wait_for() 呼び出しは、シグナルを待機するときにミューテックスのロックを解除します。そうでなければ、なぜその関数にロックを渡す必要があるのでしょうか?

ロックが wait に渡されることに注意してください。wait は、条件変数で待機しているスレッドのセットにスレッドをアトミ​​ックに追加し、ミューテックスのロックを解除します。スレッドが起動されると、wait の呼び出しが戻る前にミューテックスが再びロックされます。これにより、他のスレッドがミューテックスを取得して共有データを更新できるようになり、条件に関連付けられたデータが正しく同期されるようになります。

于 2013-11-07T14:11:20.643 に答える