2016-10-20 84 views
2

線程調用pthread_cond_timedwait之後,它返回ETIMEDOUT,該線程是否擁有該互斥鎖?pthread_cond_timedwait超時後線程是否擁有互斥鎖?

我最初會覺得沒什麼,但現在看來,我們必須電話返回ETIMEDOUTpthread_mutex_unlock甚至pthread_cond_timedwait後。

documentation說:

在成功返回時,互斥量應已被鎖定,並由調用線程擁有。

因此,在非成功返回(返回值!= 0)時,我認爲互斥量不是擁有的。

但是,如果我們不在ETIMEDOUT之後調用pthread_mutex_unlock,互斥似乎處於中斷狀態(即我無法獲得另一個線程來獲取它,它只是停頓)。

的文件也是在這個暗示爲好,因爲他們總是無論解開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後?它沒有什麼意義,因爲呼叫將不得不阻止超過特定時間才能再次獲取互斥量。

回答

4

您正在查看舊版POSIX。 Issue 7具有此澄清文本:

當這種超時發生,pthread_cond_timedwait()仍應釋放並重新獲取由互斥引用的互斥鎖,並可能消耗在條件變量同時指向的狀態信號。

如果它在這種情況下沒有重新獲取互斥量,那麼您必須在調用代碼中重新獲取它,以便在超時後重新測試條件,因爲您可能已經消耗了條件信號。只有當您等待的情況沒有發生時發生超時,您應該將其視爲超時情況。

超時並不能防止互斥持續時間過長,它會防止狀態信號沒有及時到達(一般來說,互斥量只能保持較短的相對確定的時間段,而條件爲等待可能會受到外部輸入的影響)。

相關問題