据我了解, 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? ),但这似乎是一个黑客。

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

最佳答案

您可以通过在初始化条件变量时设置属性来设置 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/

10-11 16:40