2016-10-20 6 views
2

スレッドがpthread_cond_timedwaitを呼び出した後にETIMEDOUTを返した場合、スレッドはそのスレッドを所有していますか?pthread_cond_timedwaitがタイムアウトした後にスレッドがmutexを所有していますか?

私は、最初はNOだと思うだろうが、それもpthread_cond_timedwait戻っETIMEDOUT後に我々必見コールpthread_mutex_unlockことが表示されます。

documentationは言う:正常終了時に

、ミューテックスがロックされているものとし、呼び出し元のスレッドが所有するものとします。

戻り値(戻り値!= 0)が返されなかった場合、ミューテックスは所有されていないと考えられます。

ETIMEDOUTの後にpthread_mutex_unlockを呼び出さないと、mutexが壊れているように見えます(つまり、別のスレッドで取得できなくなってしまいます)。

文書はまた、彼らは常にかかわらずpthread_cond_timedwaitの戻り値のミューテックスをアンロックとして、同様にこれをヒント:

(void) pthread_mutex_lock(&t.mn); 
       t.waiters++; 
     clock_gettime(CLOCK_REALTIME, &ts); 
     ts.tv_sec += 5; 
     rc = 0; 
     while (! mypredicate(&t) && rc == 0) 
       rc = pthread_cond_timedwait(&t.cond, &t.mn, &ts); 
     t.waiters--; 
     if (rc == 0) setmystate(&t); 
(void) pthread_mutex_unlock(&t.mn); 

ので、スレッドは常にpthread_cond_timedwait後にmutexを獲得しますか?ミューテックスを再度取得するためには、コールが指定された時間以上ブロックする必要があるため、実際には意味をなさない。

答えて

4

POSIXの古い問題があります。そのようなタイムアウトが発生した場合

pthread_cond_timedwait()は、それにもかかわらず解放しなければならないと再取得ミューテックスによって参照ミューテックス、および条件変数に同時に向けられた状態信号を消費することができる:Issue 7この清澄化テキストを有しています。

このケースでは、ミューテックスを再取得しなかった場合は、呼び出しコードで再取得する必要があります。条件を消費した可能性があるため、タイムアウト後に条件を再テストできます。信号。待機中の状態が発生していない場合にのみ、タイムアウトが発生してタイムアウトのケースとして処理する必要があります。

タイムアウトは、あまりにも長い間保持されているミューテックスに対して警戒するものではなく、適時に到着しない条件信号に対して保護しています(通常、ミューテックスは短い、比較的確定的な期間だけ保持する必要があります。外部入力の影響を受ける可能性があります)。

関連する問題