假设一个线程成功调用pthread_mutex_lock
,那么同一个线程中对pthread_mutex_unlock
的调用是否仍然可能会失败?如果是这样,除了中止线程之外,你能真正做些什么吗?
if(pthread_mutex_lock(&m) == 0)
{
// got the lock, let's do some work
if(pthread_mutex_unlock(&m) != 0) // can this really fail?
{
// ok, we have a lock but can't unlock it?
}
}
this page来自pthread_mutex_unlock()
的错误可能是:
[EINVAL] mutex指定的值不是指初始化的值 互斥对象。
如果锁定成功,那么这不太可能失败。
[EAGAIN] 无法获取互斥锁,因为最大数量为 已超出互斥锁的递归锁定。
真的?解锁?
如果出现以下情况,pthread_mutex_unlock()函数可能会失败:
[EPERM] 当前线程不拥有互斥锁。
同样,如果锁定成功,那么这也不应该发生。
所以,我的想法是,如果有一个成功的锁,那么在这种情况下解锁应该永远不会失败,使错误检查和后续处理代码毫无意义。
答案 0 :(得分:3)
在你哭“胜利”之前。我最终在这个页面上查找我的某个程序在pthread_mutex_unlock
上失败的原因(在HP-UX上,而不是Linux上)。
if (pthread_mutex_unlock(&mutex) != 0)
throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno));
在经过数百万次快乐处决后,我失败了。
errno是EINTR
,虽然我现在发现我不应该检查errno,而是返回值。但是,返回值不是0.我可以在数学上证明在那个地方我拥有一个有效的锁。
所以,我们只是说你的理论处于压力之下,虽然需要更多的研究; - )
答案 1 :(得分:2)
来自pthread_mutex_unlock的手册页:
The pthread_mutex_unlock() function may fail if:
EPERM
The current thread does not own the mutex.
These functions shall not return an error code of [EINTR].
如果您相信该手册页,那么您的错误情况似乎不会发生。