免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: embeddedlwp
打印 上一主题 下一主题

[内核同步] spin_lock死锁问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-24 15:50 |只看该作者
以下这段代码竞争的话,就会产生死锁了。因为在释放A锁之前没有释放掉B锁。 当第一个进程在4释放掉A锁后,另一个进程可能执行1,获取到这个A锁。
然后这时第一个进程获取了B锁,执行到6时等待A锁,而另一个进行获取了A锁,在2等待B锁。这样就死锁了。

如果在释放A锁之前释放掉B锁的话,也就是在3处加上spin_unlock(&B),这样就不会有问题了。所以释放锁还是要按顺序释放。
不过个人认为如果没有6,7步的话,应该释放锁的顺序没有什么影响。

1:spin_lock(&A);
2:spin_lock(&B);
3:place1
4:spin_unlock(&A);
5:some codes need not lock A
6:spin_lock(&A);
  ....
7:spin_unlock(&A);
8:spin_unlock(&B);

论坛徽章:
0
12 [报告]
发表于 2012-06-25 09:13 |只看该作者
回复 11# h123e
感觉你这个分析有问题哦,整个锁的顺序是1、2.。。。。7、8,你怎么又在中间讨论起3、4了,如果单纯的讨论1278的话,释放锁得顺序是无所谓的


   

论坛徽章:
0
13 [报告]
发表于 2012-06-25 09:18 |只看该作者
回复 7# amarant
接着你的分析:如果先释放B,则第一个进程仍然占有着锁A,然锁B属于锁A,也即B保护的资源(b)在A所保护的资源(a)中,如果此时因为占有A就去操纵a的
话,如果恰巧操纵到b,也是会出现问题(因为B已经释放了)


   

论坛徽章:
0
14 [报告]
发表于 2012-06-25 09:30 |只看该作者
回复 13# sygspjlsj


    事实上这种代码在现实中是存在的,而且我也说了“如果没有6,7步的话,应该释放锁的顺序没有什么影响。”

另外,如果按照你说的“也即B保护的资源(b)在A所保护的资源(a)中”,明明一把锁可以搞定的事,非得搞两把锁
我认为写这种代码的人就是在作死啊。从来没有听说过两把锁保护同一个资源的。

论坛徽章:
0
15 [报告]
发表于 2012-06-25 09:45 |只看该作者
回复 15# h123e
这样用锁,的确不符合逻辑,我也是照着上面有位老兄的回答来作答的。感觉这个问题大家还是没有什么结果。
有没有什么完整的实例代码具体问题来具体分析下。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP