在时间到期时结束循环
Ending a loop on time expiration
我在一个循环中进行了长时间的计算,如果允许的计算时间到期(并且 return 部分计算结果),我需要提前结束。我计划通过 SIGALARM
处理程序和计时器来完成:
// Alarm handler will set it to true.
bool expired = false;
int compute ()
{
int result;
// Computation loop:
for (...) {
// Computation here.
if (expired)
break;
}
return result;
}
我的问题是:如何正确定义expired
变量(volatile bool
或std::atomic<bool>
,或std::sig_atomic_t
等),如何设置它true
在信号处理程序中(只是一个赋值或原子操作),以及如何在 compute
函数中检查它的值?
这是单线程 C++17 代码...
如果您不使用多线程,则不需要原子操作。只需在信号处理程序中设置全局变量 expired = true
。
编辑:正如@Frank 在下面演示的那样,编译器可能会对其进行优化。您可以通过将过期声明为 volatile bool expired = false;
来避免这种情况
除非一次迭代需要相当长的时间,否则我建议您不要理会信号,只需在每次迭代时检查 gettimeofday
。
我在一个循环中进行了长时间的计算,如果允许的计算时间到期(并且 return 部分计算结果),我需要提前结束。我计划通过 SIGALARM
处理程序和计时器来完成:
// Alarm handler will set it to true.
bool expired = false;
int compute ()
{
int result;
// Computation loop:
for (...) {
// Computation here.
if (expired)
break;
}
return result;
}
我的问题是:如何正确定义expired
变量(volatile bool
或std::atomic<bool>
,或std::sig_atomic_t
等),如何设置它true
在信号处理程序中(只是一个赋值或原子操作),以及如何在 compute
函数中检查它的值?
这是单线程 C++17 代码...
如果您不使用多线程,则不需要原子操作。只需在信号处理程序中设置全局变量 expired = true
。
编辑:正如@Frank 在下面演示的那样,编译器可能会对其进行优化。您可以通过将过期声明为 volatile bool expired = false;
除非一次迭代需要相当长的时间,否则我建议您不要理会信号,只需在每次迭代时检查 gettimeofday
。