c++ - 为什么这段代码不会导致死锁?
问题描述
我有下面的代码,其中函数 bar 锁定了互斥体,然后调用了函数 foo,但是函数 foo 锁定了同一个互斥体。根据我的理解,会发生死锁,因为 foo 试图锁定同一个互斥体并且它已被锁定在函数栏中。但下面的代码执行没有任何停止。谁知道原因??
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void foo()
{
pthread_mutex_lock(&mutex);
cout<<"excuting foo!!"<<endl;
pthread_mutex_unlock(&mutex);
}
void bar()
{
pthread_mutex_lock(&mutex);
cout<<"excuting bar!!"<<endl;
foo();
pthread_mutex_unlock(&mutex);
}
int main()
{
bar();
}
解决方案
POSIX 线程规范允许 POSIX 线程实现使用标准的三种互斥锁类型中的任何一种作为默认类型:
如果互斥锁类型为 PTHREAD_MUTEX_DEFAULT,则 pthread_mutex_lock() 的行为可能对应于其他三种标准互斥锁类型之一
是什么PTHREAD_MUTEX_DEFAULT
?这几乎是您所期望的:
type 属性的默认值为 PTHREAD_MUTEX_DEFAULT。
...
实现可以将 PTHREAD_MUTEX_DEFAULT 映射到其他互斥体类型之一。
您期望您的互斥锁PTHREAD_MUTEX_NORMAL
会在这里导致死锁。但是,您的特定线程实现似乎是PTHREAD_MUTEX_RECURSIVE
类型,它可以被同一个进程多次锁定。这是您正在观察的行为。
推荐阅读
- node.js - 如何在 node.js 中添加标题
- python - 在pygame中让玩家在每个间隔移动的最佳方法是什么?
- c++ - 是否存在具有外部元素分配的序列容器(在 STL 中)?
- java - 我如何比较没有标题的csvs在java中的格式和数据差异
- java - 使用 Http 将可恢复和多部分文件上传到谷歌驱动器。最后一个块溢出错误
- api - 在 JSF/PrimeFaces 应用程序中设置 REST 服务
- javascript - 从 Javascript 脚本中循环播放 Html 视频
- pyspark - 如何在pyspark中查找数据框的大小
- amazon-web-services - AWS EC2 > 按域或 URL 过滤 IGW 出站流量
- excel - 在 Excel 2016 VBA 中,如果在表中找到匹配项,如何运行 IF 语句?