You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()这两个线程休眠接口。

核心问题解答

  1. std::this_thread::sleep_for()是否会因信号中断提前结束?
    在Linux环境下(GCC/Clang主流实现),答案是会。这类函数通常基于系统调用nanosleep实现,而nanosleep本身会被信号中断并提前返回。需要注意的是,C++标准并没有强制要求这种行为,但Linux下主流编译器的实现都遵循了系统调用的特性。

  2. 和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:50:26