gpt4 book ai didi

multithreading - pthread_cond_timedwait 超时后线程是否拥有互斥锁?

转载 作者:行者123 更新时间:2023-12-03 22:43:52 26 4
gpt4 key购买 nike

线程调用pthread_cond_timedwait 并返回ETIMEDOUT 后,线程是否拥有互斥体?

我最初认为不,但看起来我们必须调用pthread_mutex_unlock,即使在pthread_cond_timedwait 返回ETIMEDOUT 之后也是如此.

documentation说:

Upon successful return, the mutex shall have been locked and shall be owned by the calling thread.

因此,我认为,在不成功返回(返回值!= 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 之后获取互斥量?这实际上没有意义,因为调用必须阻塞超过指定时间才能再次获取互斥量。

最佳答案

您正在查看旧一期的 POSIX。 Issue 7有这个澄清的文本:

When such timeouts occur, pthread_cond_timedwait() shall nonetheless release and re-acquire the mutex referenced by mutex, and may consume a condition signal directed concurrently at the condition variable.

如果在这种情况下它没有重新获取互斥锁,您无论如何都必须在调用代码中重新获取它,以便您可以在超时后重新测试条件,因为您可能已经消耗了条件信号。仅当您等待的条件未发生并且发生超时时,您才应将其视为超时情况。

超时不是防止互斥锁被持有过长的时间,而是防止条件信号没有及时到达(通常,互斥锁只应该被持有很短的,相对确定的时间,而条件正在等待因为可能会受到外部输入的影响)。

关于multithreading - pthread_cond_timedwait 超时后线程是否拥有互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40153968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com