是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?

Posted

技术标签:

【中文标题】是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?【英文标题】:Is std::this_thread::sleep_for behaviour defined for signal interupt ( or signal handler) in C++11? 【发布时间】:2018-10-18 07:08:00 【问题描述】:

sleep()unistd.h 中的行为在 Linux http://man7.org/linux/man-pages/man3/sleep.3.html 中得到了很好的定义。

问题:

    C++11 标准是否为信号中断/信号处理程序定义了std::this_thread::sleep_for 的行为? 如果是,行为平台是否依赖? (希望不会)

    在 Linux 中实现不可中断的sleep() 的最佳方法是什么?据我所知,这可以通过在调用 sleep() 之前阻止所有信号来完成。

【问题讨论】:

【参考方案1】:

C++11 标准是否为信号中断/信号处理程序定义了 std::this_thread::sleep_for 的行为?

没有。

行为平台是否依赖?

由于未指定,所以可以。

我在linux上测试过,确实有信号提前中断了睡眠。

在 Linux 中实现不可中断的 sleep() 的最佳方法是什么?

最佳做法是不需要不可中断的sleepsleep如果被中断返回睡眠剩余时间,所以为了防止过早唤醒,你可以简单地在中断后使用循环恢复睡眠:

int time = 10;
while(time = sleep(time));

不幸的是,this_thread::sleep_for 并非如此,它不会返回中断时剩余的时间。

【讨论】:

以上是关于是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?的主要内容,如果未能解决你的问题,请参考以下文章