gpt4 book ai didi

clock_nanosleep 不工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:06 29 4
gpt4 key购买 nike

我尝试通过使用 clock_nanosleep 的这段代码休眠半秒钟,但我无法让它工作。我的代码总是立即执行,就好像 sleep 不存在一样。我做错了什么?

    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

我做错了什么? (我需要一些特定的内核配置来允许这种 sleep 吗?我在一个非常小的 gentoo 上运行,所以也许我必须检查一些配置选项?

总的来说,我想实现的是这个线程对一些值做一些更新,然后休眠半秒,包括它正在工作的时间。如果我做错了,并且有更好的选择,请告诉我,因为我不一定要为此使用 clock_nanosleep,它似乎是合适的解决方案。

最佳答案

当您将 0.5 秒添加到 now 时,您需要处理溢出。

改变:

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

关于clock_nanosleep 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845753/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com