是否为 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() 的最佳方法是什么?
最佳做法是不需要不可中断的sleep
。 sleep
如果被中断返回睡眠剩余时间,所以为了防止过早唤醒,你可以简单地在中断后使用循环恢复睡眠:
int time = 10;
while(time = sleep(time));
不幸的是,this_thread::sleep_for
并非如此,它不会返回中断时剩余的时间。
【讨论】:
以上是关于是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?的主要内容,如果未能解决你的问题,请参考以下文章