c++ - Pthreads- 1个锁,2个解锁

标签 c++ c locking pthreads mutex

如果我理解正确,那么 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/

相关文章:

根据c中的另一个条件更改循环条件语句

c - 需要一种快速方法将大量 double 转换为字符串

c++ - DLL 中 C 风格函数中的静态变量

java - 使用分布式 JVM 缓存同步计算和结果

c++ - MSVC++ 中可能的编译器错误

c++ - 匿名命名空间内运算符的模板重载解析

c++ - C++ std::mutex 如何绑定(bind)到资源?

mysql - 数据库队列的并发问题,需要可移植的解决方案

c++ - 变量的复杂约束函数

c++ - 使用std::multimap时c++发生运行时错误的机会很小