2017-09-14 61 views
2

據我瞭解,那麼pthread_cond_timedwait是採取當前的時間,然後計算時的絕對時間,如果條件沒有信號那麼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?),但它似乎是一個黑客攻擊的解決方案。

是否有不同的&更好的方式讓線程在某個時間間隔內休眠(不易掛鐘變化),但立即響應外部條件?

回答

5

初始化條件變量時,可以設置通過設置屬性使用那麼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);