次のように動作するタイマーを作成しました。タイマーを使用するクラスは、コールバック関数を実装します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()
ますか?