首页 > 解决方案 > 是否为 C++11 中的信号中断(或信号处理程序)定义了 std::this_thread::sleep_for 行为?

问题描述

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

问题:

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

  2. sleep()在 Linux中实现不可中断的最佳方法是什么?据我所知,这可以通过在调用sleep().

标签: c++linux

解决方案


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

不。

行为平台是否依赖?

由于未指定,因此可以。

我在linux上测试过,一个信号确实过早地中断了睡眠。

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

最佳实践是不需要不可中断的sleep. sleep如果中断,则返回剩余的睡眠时间,因此为了防止过早唤醒,您可以在中断后使用循环简单地恢复睡眠:

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

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


推荐阅读