我尝试使用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,这似乎是合适的解决方案。
答案 0 :(得分:2)
在向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++;
}