你如何处理pthread_mutex_unlock失败?

时间:2011-09-14 20:04:24

标签: pthreads

假设一个线程成功调用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]       当前线程不拥有互斥锁。

同样,如果锁定成功,那么这也不应该发生。

所以,我的想法是,如果有一个成功的锁,那么在这种情况下解锁应该永远不会失败,使错误检查和后续处理代码毫无意义。

2 个答案:

答案 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].

如果您相信该手册页,那么您的错误情况似乎不会发生。