我正在寻找一种每隔X秒执行一些代码的方法,但如果在X秒内发生事件,则立即中断。
最初我有一个带有睡眠声明的while循环。然而这是有问题的,因为如果代码正在睡眠,我无法立即停止代码并且必须等到睡眠结束。
有没有简单的方法我可以执行然后睡眠,但在事件中中断这个睡眠?
编辑:选择了带有notify_all()的条件变量。
答案 0 :(得分:1)
您似乎已经找到了答案,但有条件的等待互斥是这里的最佳解决方案。您实际上可以锁定互斥锁并将其放入等待条件对象以及一些超时。然后,其他一些线程可以使用相同(共享)的等待条件对象发送/通知您的线程。如果没有人在指定的超时时间内通知/发出互斥信号,则等待将暂时退出。
这种可中断睡眠的好处在于它不是一个忙碌的等待。
答案 1 :(得分:0)
我认为你不能打断睡眠,但你可以让你的代码在更短的时间内睡觉,并定期检查信号。
#include <thread>
#include <chrono>
int main()
{
using namespace std::chrono;
unsigned Y = 100;
unsigned X = 1;
bool signaled = false;
while (!signaled)
{
// Do Stuff every X seconds
high_resolution_clock::time_point const p = high_resolution_clock::now();
while (duration_cast<milliseconds>(high_resolution_clock::now() - p).count() <
duration_cast<milliseconds>(std::chrono::seconds(X)).count())
{
// Code to check for a signal every Y milliseconds
if (signaled)
{
break;
}
std::this_thread::sleep_for(milliseconds(Y));
}
}
return 0;
}
注:系统时钟分辨率;调整信号检查频率时可能需要权衡CPU负载(取决于信号检查代码的要求);