如何使线程睡眠/阻塞纳秒(或至less几毫秒)?

我怎么能阻止我的线程(也许进程)纳秒或可能一毫秒(至less)期?

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

Solutions Collecting From Web of "如何使线程睡眠/阻塞纳秒(或至less几毫秒)?"

nanosleepclock_nanosleep是您应该使用的函数(后者允许您指定绝对时间而不是相对时间,并使用单调时钟或其他时钟,而不仅仅是实时时钟,如果操作员重置它,可能会倒退)。

但请注意,就分辨率而言,你几乎不会超过几微秒,并且总是会缩短睡眠时间,而不是四舍五入。 (舍入通常是不可能的,因为在大多数机器上,进入和退出内核空间需要超过1微秒)。

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

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

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

试试usleep() 。 是的,这不会给你纳秒精度,但微秒也会工作=>毫秒。

由于一般Linux发行版不是(硬)实时操作系统,所以在一般的Linux操作系统上准确的纳秒分辨率是不可能的。 如果您真的需要对时间进行细粒度的控制,请考虑使用这样的操作系统。

维基百科在这里有一些实时操作系统的列表: http : //en.wikipedia.org/wiki/RTOS (注意,它并没有说它们是实时的软还是硬的,所以你必须做一些研究)。

使用睡眠的任何变种pthreads,行为不能保证。 所有的线程也可以睡觉,因为内核不知道不同的线程。 因此,pthread库可以处理的是一个解决方案,而不是内核。

更安全,更干净的解决方案是使用pthread_cond_timedwait …

 pthread_mutex_t fakeMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t fakeCond = PTHREAD_COND_INITIALIZER; void mywait(int timeInSec) { struct timespec timeToWait; struct timeval now; int rt; gettimeofday(&now,NULL); timeToWait.tv_sec = now.tv_sec + timeInSec; timeToWait.tv_nsec = now.tv_usec*1000; pthread_mutex_lock(&fakeMutex); rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait); pthread_mutex_unlock(&fakeMutex); printf("\nDone\n"); } void* fun(void* arg) { printf("\nIn thread\n"); mywait(5); } int main() { pthread_t thread; void *ret; pthread_create(&thread, NULL, fun, NULL); pthread_join(thread,&ret); } 

对于pthread_cond_timedwait,您需要指定从当前时间开始等待多少时间。

现在通过使用函数mywait(),只有调用它的线程会睡眠,而不是其他线程。

nanosleep允许你指定睡眠的准确度下降到纳秒。 但是,由于内核/ CPU的限制,您睡眠的实际分辨率可能会更大。

在可以访问多个硬件定时器的嵌入式系统上,为纳秒或微秒等待创建一个高速时钟。 创建一个宏来启用和禁用它,并在定时器中断服务程序中处理您的高分辨率处理。

如果浪费电力和忙等待不是问题,请执行一些没有操作的指令 – 但请确认编译器不会优化您的免费指令。 尝试使用易失性类型。