我写了一个定时器,它的工作方式如下:一个使用定时器的类实现了一个回调函数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()
,有时则不会(在测试程序的不同运行中)。
我的猜测是竞争条件,似乎 if time
is smallcall()_
是在之前执行(因此signal_.notify_all()
)signal_.wait(lock)
。
如果我this_thread::sleep(posix_time::milliseconds(2))
之前添加signal_.notify_all()
,
do_something()
几乎每次运行都会执行,并且sleep(5)
一切正常。
我如何保证signal_.wait(lock)
之前执行signal_.notify_all()
?