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

Linux单进程中如何让单个线程暂停0.5秒且不阻塞其他线程

Linux单进程内单个线程暂停0.5秒且不阻塞其他线程的实现方法

在Linux系统中,要让单进程内的某个线程暂停0.5秒且不影响其他线程,核心是使用线程安全的睡眠函数——这类函数只会让调用它的线程进入阻塞状态,进程内的其他线程可正常调度执行。以下是几种可行的实现方式:

1. 使用nanosleep()函数

这是最推荐的方式,它支持纳秒级精度,且完全线程安全。函数会将当前线程挂起指定时长,不会干扰同进程的其他线程。

示例代码:

#include <time.h>
#include <pthread.h>

// 需要暂停的线程函数
void* paused_thread(void* arg) {
    struct timespec sleep_time;
    // 设置睡眠时长为0.5秒(0秒 + 500,000,000纳秒)
    sleep_time.tv_sec = 0;
    sleep_time.tv_nsec = 500000000;
    
    // 执行睡眠,第二个参数用于接收剩余未睡眠的时长(这里传NULL忽略)
    nanosleep(&sleep_time, NULL);
    
    // 睡眠结束后继续执行后续逻辑
    return NULL;
}

// 另一个线程函数,不受睡眠影响
void* normal_thread(void* arg) {
    // 正常执行自己的业务逻辑,不会被阻塞
    while(1) {
        // 示例操作
    }
    return NULL;
}

2. 使用clock_nanosleep()函数

如果需要避免系统时间变化(比如手动修改系统时间)对睡眠时长的影响,可以用clock_nanosleep(),指定CLOCK_MONOTONIC时钟(基于系统启动后的单调时间),睡眠精度更可靠。

示例代码:

#include <time.h>
#include <pthread.h>

void* paused_thread(void* arg) {
    struct timespec sleep_time;
    sleep_time.tv_sec = 0;
    sleep_time.tv_nsec = 500000000;
    
    // 使用单调时钟,确保睡眠时长不受系统时间调整影响
    clock_nanosleep(CLOCK_MONOTONIC, 0, &sleep_time, NULL);
    
    return NULL;
}

注意事项

  • 避免使用usleep():该函数已被POSIX标准标记为过时,推荐用nanosleep()替代。
  • 不要混淆进程级和线程级睡眠:上述函数都是线程安全的,而早期的进程级睡眠接口(如sleep(),虽Linux下现在也线程安全,但精度只有秒级,无法满足0.5秒的需求)不适合这种场景。

内容的提问来源于stack exchange,提问作者FourierFlux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:42:36