当使用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()
的调用也被中断(按规定提前结束)?
1条答案
按热度按时间0lvr5msh1#
如果你使用GCC的libstdc++,你可以在这里找到相应的代码:
所以它基本上做了和你的代码循环一样的事情,在信号中断后重新启动睡眠。
C++标准本身说:
函数名以_结尾的函数接受一个指定持续时间的参数。这些函数产生相对超时。实现应该使用一个稳定的时钟来测量这些函数的时间。给定一个持续时间参数Dt,超时的实时持续时间为Dt+Di+Dm。
其中Di和Dm是由实现和资源管理引入的延迟,如标准的前一句所述。假设这些延迟是正的(它们应该是正的),则睡眠时间总是至少与指定的时间一样长。
因此,在我看来,标准保证了睡眠不会过早结束。