[英]clock_nanosleep not working?
我尝试使用clock_nanosleep将此代码段睡眠半秒钟,但是我无法使其工作。 我的代码总是立即执行,就好像睡眠不存在一样。 我究竟做错了什么?
while (true)
{
/* CRITICAL SECTION BEGIN */
pthread_mutex_lock(&lock);
ret = clock_gettime(CLOCK_MONOTONIC, &now);
if (ret) {
perror ("clock_gettime");
exit(1);
}
for (i = 0; i < some_value ; i++){
/* Do some stuff */
}
/* Update sleep time */
now.tv_nsec += 500000000;
pthread_mutex_unlock(&lock);
/* CRITICAL SECTION END */
clock_gettime(CLOCK_MONOTONIC, &debug);
printf("Clockgoal - now: : %lu\n", now.tv_nsec - debug.tv_nsec);
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &now, NULL);
}
它以pthread的形式运行,但它根本没有休眠。 printf输出显示如下:
Done Updating Time!
Clockgoal - now: : 499997443
Done Updating Time!
Clockgoal - now: : 499997441
我究竟做错了什么? (我需要一些特定的内核配置来允许这种睡眠吗?我在一个非常小的gentoo上运行,所以也许我必须检查一些配置选项?
总的来说,我想要实现的是该线程对某些值进行了一些更新,然后睡眠了半秒钟,包括其工作时间。 如果我做错了,还有更好的选择,请告诉我,因为我不必为此使用clock_nanosleep,它似乎是合适的解决方案。
now
添加0.5秒时,您需要处理溢出。
更改:
now.tv_nsec += 500000000;
至:
now.tv_nsec += 500000000L; // add 0.5s
if (now.tv_nsec >= 1000000000L) // if ns field overflows
{
now.tv_nsec -= 1000000000L; // handle "carry" to seconds field
now.tv_sec++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.