次のように動作するタイマーを作成しました。タイマーを使用するクラスは、コールバック関数を実装しますcall_()。タイマーは別のスレッドで実行さcall_()れ、タイマーが期限切れになると実行されます。
私のテストプログラムは次のとおりです。
void TestCase::loop()
{
unique_lock<mutex> lock(*this);
while(running_)
{
timer_->SetTimer(time);
signal_.wait(lock);
do_something();
}
}
void TestCase::call_()
{
signal_.notify_all();
}
timeが非常に小さい場合(たとえば 2 ミリ秒)、テスト プログラムが実行される場合と実行do_something()されない場合があります (テスト プログラムの異なる実行で)。
私の推測では競合状態timeです。call()_signal_.notify_all()signal_.wait(lock)
this_thread::sleep(posix_time::milliseconds(2))beforesignal_.notify_all()を
追加するdo_something()と、ほぼすべての実行で実行され、sleep(5)すべて正常に動作します。
signal_.wait(lock)が前に実行されることをどのように保証できsignal_.notify_all()ますか?