【发布时间】:2021-11-29 13:03:04
【问题描述】:
我有一个线程,我们称之为 t1,它会在 x 秒后定期发送一些东西。 这个“x 秒部分”可以从其他线程 (t2) 更改。 我应该能够从线程 t1 执行以下操作。
- 等待“x 秒”,然后发送内容
- 如果线程 t2 发送另一个 "x" 值,则不要发送,而是转到步骤 1。
我已经通过 wait_for() 使用了条件变量
我只想在“x 秒”结束时发送。
目前我已经在没有谓词的情况下实现了它(因为我不需要它)是这样的:
auto done = wait_for(lock,x seconds);
if(done == cv_status::timeout)
{
/*perform send operation*/
}
但有时我会在 timeout 之前看到“发送发生”,我认为这是由于虚假唤醒和缺少谓词造成的。
我的问题是如何在没有谓词的情况下处理虚假唤醒?我应该为此采取另一种方法吗? 我不需要谓词,因为线程 t1 在特定条件下休眠(当 x 为 0 时),我希望它(t1)在没有任何条件的情况下被 t2 唤醒。
这是我第一个使用 cond 变量的任务,我还在学习 CPP,提前谢谢你。
【问题讨论】:
-
见重载(2)"...这个重载可以用来忽略虚假的觉醒......" en.cppreference.com/w/cpp/thread/condition_variable/wait_for
标签: c++ multithreading condition-variable spurious-wakeup