什么时候会需要两个互斥锁??

发布于 2022-09-11 15:37:57 字数 754 浏览 10 评论 0

大家好,我在学习互斥锁的内容
不理解的是,死锁产生的两种情况:

1、一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此就永远处于挂起等待状态了,这叫做死锁(Deadlock)。

2、另一种:若线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都永远处于挂起状态了。

情况1我了解,如果自己上锁后又尝试上锁,那就死锁了
第二种我就搞不明白,为什么会有两个锁???我能理解的是设置了两个锁,两个锁的属性不同,只有这个时候会需要两个锁,不可能会有两个属性相同的锁。而且这种获得了锁A,又请求获得锁B的方法,也是一种故障用法,没有意义的。

请问我的思路是否正确?
/××××××××××××××××××××××××××××/
感觉我没说清楚,我重新捋一下;
我在网上看教程,看到说死锁产生有两种情况。
1、线程调用lock后,没有unlock又继续lock。
2、线程A获得了锁1,线程B获得了锁2;继而A又调用锁2,而此时B又调用的锁1,导致互相等待死锁。
问题1:intpthread_mutex_init初始化时,并没有指定数据,本进程中的临界区数据都会被锁,所以一个锁即可锁本进程数据;是否一个进程,只需要一个锁?
问题2:锁的属性有多种,一个进程如果有多个锁,那必然是多种类型的锁,同一个类型的锁,一个即可?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橙味迷妹 2022-09-18 15:37:57

一般的锁都是可重入的,所以同一个线程多次获取同一个锁都是可以成功的,不会挂起。

第二个问题其实也很好理解,锁是用来保护资源的,程序里面有多个资源的时候,就可能需要多个锁来保护了。

七七 2022-09-18 15:37:57

锁是锁一条数据的,而不是锁整个数据库的,不然并发得多差
比如写转账服务,A转给B,先锁A再锁B,若此时又有一个B转A的请求(然后服务需要先锁B再锁A),就可能发生死锁。解决方法是按照用户id顺序上锁

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文