gpt4 book ai didi

c - 在 c (pthreads) 中获得线程紧时的最佳方法是什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:46 26 4
gpt4 key购买 nike

好吧,我有一个线程,我需要恰好每 10 毫秒运行一次,但它需要可变的处理时间(为简单起见,我们可以假设处理时间少于 10 毫秒)。随着时间的推移,时间上的小偏差会累积起来并成为一个问题。

这是我目前的解决方案。这看起来很笨重,但我更担心运行 timeval_subtract 会导致我的时间被关闭所花费的时间。有没有人有更好的解决方案?

这是一个图书馆,我不能使用像定时器或时钟这样的系统资源。

void mythread(void *ptr )
{
struct timeval tv_being, tv_end;
int usToSleep;

while(1)
{
gettimeofday(&tv_begin)

//do stuff

//now determine how long to sleep so we wake up 10ms after previous wakeup

gettimeofday(&tv_end)

usToSleep = timeval_subtract(tv_begin, tv_end); //this will return 10ms minus the elapsed time

usleep(usToSleep);
}

return;
}

最佳答案

您的方法会随着时间的推移累积错误 - 例如,如果 sleep 运行一次长 1 毫秒,那么您将永远无法 catch 备份。结果将是,在很长一段时间内,与每 10 毫秒运行一次相比,您运行循环的次数会更少。

为避免这种情况,请预先调用一次时间函数,然后据此计算 future 的截止日期。将 clock_gettime()CLOCK_MONOTONIC 时钟一起使用优于 gettimeofday(),因为后者是实时时钟,因此在管理员时会受到影响更改系统时间。

例如:

#include <time.h>
#include <errno.h>

void mythread(void *ptr )
{
struct timespec deadline;

clock_gettime(CLOCK_MONOTONIC, &deadline);

while(1)
{
//do stuff

/* Add 10ms to previous deadline */
deadline.tv_nsec += 10000000;
deadline.tv_sec += deadline.tv_nsec / 1000000000;
deadline.tv_nsec %= 1000000000;
/* Sleep until new deadline */
while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) != 0)
if (errno != EINTR) return;
}

return;
}

(在 2.17 之前的 glibc 版本上,您需要链接 -lrt 才能使用 POSIX 时钟功能)。

关于c - 在 c (pthreads) 中获得线程紧时的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679718/

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