2017-09-14 13 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); 
関連する問題