2016-10-20 47 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()仍应释放并重新获取由互斥引用的互斥锁,并可能消耗在条件变量同时指向的状态信号。

如果它在这种情况下没有重新获取互斥量,那么您必须在调用代码中重新获取它,以便在超时后重新测试条件,因为您可能已经消耗了条件信号。只有当您等待的情况没有发生时发生超时,您应该将其视为超时情况。

超时并不能防止互斥持续时间过长,它会防止状态信号没有及时到达(一般来说,互斥量只能保持较短的相对确定的时间段,而条件为等待可能会受到外部输入的影响)。

相关问题