this_thread::sleep()在Linux上可以被中断吗?

rqenqsqc  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(138)

当使用nanosleep时,我们需要检查返回值,以检测我们是否被一个信号中断:

while ((nanosleep(&rqtp, &rmtp) == -1) && (errno == EINTR))
{
    if (rmtp.tv_nsec != 0 || rmtp.tv_sec != 0)
    {
        rqtp = rmtp;
        continue; /* Wait again when interrupted by a signal handler */
    }
}

我想使用std::this_thread::sleep_for()而不是nanosleep()。是否有可能对this_thread::sleep_for()的调用也被中断(按规定提前结束)?

0lvr5msh

0lvr5msh1#

如果你使用GCC的libstdc++,你可以在这里找到相应的代码:

while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR)
      { }

所以它基本上做了和你的代码循环一样的事情,在信号中断后重新启动睡眠。
C++标准本身说:
函数名以_结尾的函数接受一个指定持续时间的参数。这些函数产生相对超时。实现应该使用一个稳定的时钟来测量这些函数的时间。给定一个持续时间参数Dt,超时的实时持续时间为Dt+Di+Dm。
其中Di和Dm是由实现和资源管理引入的延迟,如标准的前一句所述。假设这些延迟是正的(它们应该是正的),则睡眠时间总是至少与指定的时间一样长。
因此,在我看来,标准保证了睡眠不会过早结束。

相关问题