在时间到期时结束循环

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 boolstd::atomic<bool>,或std::sig_atomic_t等),如何设置它true 在信号处理程序中(只是一个赋值或原子操作),以及如何在 compute 函数中检查它的值?

这是单线程 C++17 代码...

如果您不使用多线程,则不需要原子操作。只需在信号处理程序中设置全局变量 expired = true

编辑:正如@Frank 在下面演示的那样,编译器可能会对其进行优化。您可以通过将过期声明为 volatile bool expired = false;

来避免这种情况

除非一次迭代需要相当长的时间,否则我建议您不要理会信号,只需在每次迭代时检查 gettimeofday