首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理pthread_mutex_unlock故障?

如何处理pthread_mutex_unlock故障?
EN

Stack Overflow用户
提问于 2011-09-14 20:04:23
回答 2查看 7.9K关注 0票数 11

假设一个线程成功地调用了pthread_mutex_lock,那么该线程中对pthread_mutex_unlock的调用是否仍然可能失败?如果是这样的话,除了中止线程之外,您还能做些什么吗?

代码语言:javascript
复制
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?
   }
}

此页中,pthread_mutex_unlock()可能出现的错误如下:

EINVAL由互斥对象指定的值不引用初始化的互斥对象。

如果锁成功了,那么这不太可能失败。

无法获得EAGAIN互斥锁,因为超过了互斥锁的最大递归锁数。

真的?为了解锁?

如果以下情况,pthread_mutex_unlock()函数可能会失败: 当前线程不拥有互斥体。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-14 22:18:11

来自pthread_mutex_unlock的手册页:

代码语言:javascript
复制
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].

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

票数 2
EN

Stack Overflow用户

发布于 2011-09-30 14:45:08

在你喊“胜利”之前。我最后在这个页面上寻找了为什么我的一个程序在pthread_mutex_unlock上失败的原因(在HP上,而不是在Linux上)。

代码语言:javascript
复制
if (pthread_mutex_unlock(&mutex) != 0)
   throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno));

在经历了数百万次愉快的处决之后,这一切在我身上失败了。errno是EINTR,尽管我刚刚发现不应该检查errno,而应该检查返回值。但是,返回值不是0。我可以从数学上证明在那个地方我确实拥有一个有效的锁。

因此,假设你的理论正处于压力之下,尽管还需要更多的研究;-)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7422316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档