clock_nanosleep不工作?

时间:2016-04-25 16:10:53

标签: c linux multithreading

我尝试使用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,这似乎是合适的解决方案。

1 个答案:

答案 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++;
}