Linux下std::this_thread::sleep()与sleep_for()是否会被信号中断?
Linux环境下std::this_thread::sleep系列函数的信号中断问题
先明确一个细节
C标准库中并没有std::this_thread::sleep()这个函数,你大概率是指C11起提供的std::this_thread::sleep_for()或std::this_thread::sleep_until()这两个线程休眠接口。
核心问题解答
std::this_thread::sleep_for()是否会因信号中断提前结束?
在Linux环境下(GCC/Clang主流实现),答案是会。这类函数通常基于系统调用nanosleep实现,而nanosleep本身会被信号中断并提前返回。需要注意的是,C++标准并没有强制要求这种行为,但Linux下主流编译器的实现都遵循了系统调用的特性。和
nanosleep的差异
原生nanosleep被信号中断时,会返回-1并设置errno=EINTR,同时通过第二个参数输出剩余睡眠时间,允许调用者循环补眠,就像你给出的示例代码:
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的补眠逻辑,你需要自行实现:比如记录休眠开始的时间点,每次sleep_for返回后计算已休眠时长,若未达到目标时长则继续休眠剩余时间。
内容的提问来源于stack exchange,提问作者Christian Troester
相关产品推荐
相关产品推荐

