如果我理解正确,那么 foo1() 无法解锁 &private_value_。结果,foo2() 的 thread_mutex_lock 不起作用,因为 foo1() 从未释放它。
其他后果是什么?
int main ( ... )
foo1();
foo2();
return 0;
}
foo1()
{
pthread_mutex_lock(&private_value_);
do something
// no unlock!
}
foo2()
{
pthread_mutex_lock(&private_value_)
do something
pthread_mutex_unlock(&private_value_);
}
最佳答案
程序应该 的编写方式与当前编写的程序将 的行为方式之间似乎存在一些混淆。
这段代码会导致死锁,这并不表示互斥体的工作方式有问题。它们完全按照预期的方式工作:如果您尝试重新获取已锁定的非递归互斥量,您的代码将阻塞,直到互斥量被解锁。这就是它应该如何工作的。
由于此代码是单线程的,foo2
中的阻塞将永远不会结束,因此您的程序将死锁而不会继续进行。这很可能不是程序应该 的工作方式(因为那样的话它不是一个非常有用的程序)。错误不在于互斥锁的工作方式,而在于程序员如何选择使用它们。程序员应该在foo1
的末尾放置一个解锁调用。
关于c++ - Pthreads- 1个锁,2个解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3471148/