gpt4 book ai didi

c - pthread_cond_timedwait 用于周期性任务和挂钟变化

转载 作者:太空狗 更新时间:2023-10-29 15:21:22 26 4
gpt4 key购买 nike

据我了解,pthread_cond_timedwait 的使用方法是获取当前时间,然后计算如果条件未发出信号 pthread_cond_timedwait 应退出的绝对时间。

有没有一种简单的方法可以使用此函数可靠地执行周期性任务(问题是在获取当前时间点和调用 pthread_cond_timedwait 之间的时间点之间的时间变化)?

我有一个应该每秒运行一次的周期性任务。

do {
pthread_mutex_lock(mutex);
tx = gettimeofday + 1 second;
do_some_simple_periodic_task();
pthread_cond_timedwait(condition, mutex, tx);
pthread_mutex_unlock(mutex);
} while (!some_exit_condition);

如果上下文(包括 some_exit_condition)更新,则发出条件信号。

有没有办法使用单调定时器或类似的东西?如果不是,那么 pthread_cond_timedwait 的用例到底是什么?仅适用于您不关心额外延迟一小时的情况?

我见过一个解决方案,其中另一个线程定期向这个线程发送信号 ( How to make pthread_cond_timedwait() robust against system clock manipulations? ),但这似乎是一个 hack。

是否有不同且更好的方法让线程休眠一段时间(不易受挂钟变化影响)但立即响应外部条件?

最佳答案

初始化条件变量时可以通过设置属性来设置pthread_cond_timedwait()使用的时钟类型:

pthread_condattr_t cond_attr;
pthread_cond_t cond;

errno = pthread_condattr_init (&cond_attr);
if (errno) {
perror ("pthread_condattr_init");
return -1;
}

errno = pthread_condattr_setclock (&cond_attr, CLOCK_MONOTONIC);
if (errno) {
perror ("pthread_condattr_setclock");
return -1;
}

errno = pthread_cond_init (&cond, &cond_attr);
if (errno) {
perror ("pthread_cond_init");
return -1;
}

然后使用 CLOCK_MONOTONIC 的时间超时:

struct timespec timeout;
clock_gettime (CLOCK_MONOTONIC, &timeout);
timeout.tv_sec += 1;

// pthread_cond_timedwait (..., timeout);

关于c - pthread_cond_timedwait 用于周期性任务和挂钟变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46219838/

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