假设一个线程成功地调用了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?
}
}在此页中,pthread_mutex_unlock()可能出现的错误如下:
EINVAL由互斥对象指定的值不引用初始化的互斥对象。
如果锁成功了,那么这不太可能失败。
无法获得EAGAIN互斥锁,因为超过了互斥锁的最大递归锁数。
真的?为了解锁?
如果以下情况,pthread_mutex_unlock()函数可能会失败: 当前线程不拥有互斥体。
同样,如果锁成功,那么这也不应该发生。
因此,我的想法是,如果有一个成功的锁,那么在这种情况下,解锁永远不会失败,使错误检查和随后的处理代码毫无意义。
发布于 2011-09-14 22:18:11
来自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].如果您相信手册页,似乎您的错误情况不会发生。
发布于 2011-09-30 14:45:08
在你喊“胜利”之前。我最后在这个页面上寻找了为什么我的一个程序在pthread_mutex_unlock上失败的原因(在HP上,而不是在Linux上)。
if (pthread_mutex_unlock(&mutex) != 0)
throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno));在经历了数百万次愉快的处决之后,这一切在我身上失败了。errno是EINTR,尽管我刚刚发现不应该检查errno,而应该检查返回值。但是,返回值不是0。我可以从数学上证明在那个地方我确实拥有一个有效的锁。
因此,假设你的理论正处于压力之下,尽管还需要更多的研究;-)
https://stackoverflow.com/questions/7422316
复制相似问题