gpt4 book ai didi

c++ - 防止竞争条件

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:21 25 4
gpt4 key购买 nike

我写了一个定时器,它的工作方式如下:使用计时器的类实现回调函数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 非常小(例如 2ms),测试程序有时会执行 do_something() ,有时不会(在测试程序的不同运行中)。

我的猜测是一个竞争条件,似乎如果 time 很小 call()_ 被执行(因此 signal_.notify_all() ) 在 signal_.wait(lock) 之前。

如果我在 signal_.notify_all() 之前添加 this_thread::sleep(posix_time::milliseconds(2))do_something() 几乎在每次运行时都会执行,对于 sleep(5) 一切正常。

如何确保 signal_.wait(lock)signal_.notify_all() 之前执行?

最佳答案

如果超时值非常小,则无法保证主线程在计时器线程执行 signal_.notify_all 语句之前到达 signal_wait 语句。

由于您使用的是一次性计时器,因此更好的替代方法是使用信号量而不是条件变量来同步两个线程。

正如您在条件变量中看到的那样,等待和通知必须按一定顺序执行才能使机制正常工作。

有了信号量,执行等待的线程也将停止,直到另一个线程发布信号量,但是没有要求等待和发布操作的顺序。如果先到达帖子,则等待会立即返回(并且成功)。

关于c++ - 防止竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com