繁体   English   中英

clock_nanosleep无法正常工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM