如何使线程休眠/阻塞纳秒(或至少毫秒)?

kin*_*er1 11 c linux sleep pthreads

如何阻止我的线程(可能是进程)纳秒或者可能是一毫秒(至少)一段时间?

请注意,我不能使用睡眠,因为睡眠的参数总是在几秒钟内.

R..*_*R.. 10

nanosleep或者clock_nanosleep是您应该使用的功能(后者允许您指定绝对时间而不是相对时间,并使用单调时钟或其他时钟而不仅仅是实时时钟,如果操作员重置它可能会向后运行).

但要注意的是,就分辨率而言,你几乎不会超过几微秒,它总是会使睡眠持续时间变长,而不是四舍五入.(无论如何,向下舍入通常是不可能的,因为在大多数机器上,进入和退出内核空间需要超过一微秒.)

此外,如果可能的话,我会建议使用一个阻止等待事件的呼叫,而不是在小的时间间隔内休眠,然后进行轮询.例如,pthread_cond_wait,pthread_cond_timedwait,sem_wait,sem_timedwait,select,read,等,这取决于你的线程正在执行什么任务,以及它如何与其他线程同步和/或与外界通信.


Max*_*kin 5

一种相对便携的方式是使用select()pselect()不使用文件描述符:

void sleep(unsigned long nsec) {
    struct timespec delay = { nsec / 1000000000, nsec % 1000000000 };
    pselect(0, NULL, NULL, NULL, &delay, NULL);
}
Run Code Online (Sandbox Code Playgroud)