【发布时间】:2017-03-02 10:14:05
【问题描述】:
线程调用pthread_cond_timedwait,返回ETIMEDOUT后,线程是否拥有互斥锁?
我最初认为不,但似乎我们必须调用pthread_mutex_unlock,即使在pthread_cond_timedwait 返回ETIMEDOUT 之后。
成功返回后,互斥体将被锁定并归调用线程所有。
因此,如果返回不成功(返回值!= 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 之后获取互斥锁吗?这实际上没有意义,因为调用必须阻塞超过指定时间才能再次获取互斥锁。
【问题讨论】:
标签: multithreading pthreads posix condition-variable