【问题标题】:pthread_cond_timedwait for periodic tasks & wall clock changespthread_cond_timedwait 用于周期性任务和挂钟更改
【发布时间】:2017-09-14 12:57:17
【问题描述】:

据我了解,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。

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

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2012-04-01
      • 2019-05-25
      • 1970-01-01
      • 2019-02-16
      • 2018-11-28
      相关资源
      最近更新 更多