【发布时间】:2012-11-29 10:08:11
【问题描述】:
我写了一个定时器,它的工作方式如下:
使用计时器的类实现了回调函数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_.wait(lock) 之前执行(因此 signal_.notify_all() )。
如果我在signal_.notify_all() 之前添加this_thread::sleep(posix_time::milliseconds(2)),
do_something() 几乎在每次运行中都会执行,对于 sleep(5) 来说一切正常。
如何确保signal_.wait(lock) 在signal_.notify_all() 之前执行?
【问题讨论】:
-
你在哪里改变running_的值?我的猜测是您的问题与该变量有关。
-
如果你必须确保 'wait' 在 'notify' 之前执行,这是错误的信号类型。你需要一个线程安全的条件变量。
-
测试程序running_在构造函数中设置为true,在TestCase的析构函数中设置为false
-
请提供一个工作,嗯,编译的例子
-
@ActiveTrayPrntrTagDataStrDrvr:这是我的第一个想法 :-) 我用过
boost::conditional_variable signal_boost 有线程安全的条件变量吗?我在文档中没有找到任何内容。
标签: c++ multithreading boost