免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3852 | 回复: 0
打印 上一主题 下一主题

多线程操作中,使用信号量与独占锁产生死锁的案例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-23 15:01 |只看该作者 |倒序浏览
多线程操作中,使用信号量与独占锁产生死锁的案例\r\n\r\n环 境: informix\r\n\r\n问题描述: 多线程操作中,使用信号量与独占锁产生死锁\r\n\r\n解 答:\r\n\r\n如果开发人员写下如下多线程工作的代码,应用将会遇到性能问题并且伴随有154的锁冲突错误。\r\n\r\n下面的代码段含有逻辑陷阱, 所有的更新操作包含在一个事物当中,每一个更新语句将会有一个独占锁,直到整个事物完成。如果程序按如下顺序运行,如题的问题将会发生:\r\n\r\n1) 当程序A 释放信号量\r\n2) 程序 B 在程序 A 之前得到信号量\r\n\r\n在此情况下,程序B将由于程序A的独占锁而不能更新。并等待deadlock timeout。程序A则在timeout的时间内不能做任何操作。\r\n\r\n------------------------------------------------------\r\n\r\nbegin work\r\n\r\nset lock mode to wait 10\r\n\r\nLoop module start /*update the same row with table_1 many times*/\r\n\r\n\r\nfetch a row data from table_1\r\n\r\nget semaphore\r\n\r\nupdate table_2\r\n\r\nrelease semaphore\r\n\r\nLoop module end\r\n\r\ncommit work\r\n\r\n------------------------------------------------------\r\n\r\n对上述代码做如下修改即可避免该问题:\r\n\r\n------------------------------------------------------\r\n\r\nbegin work\r\n\r\nset lock mode to wait 10\r\n\r\nget semaphore\r\n\r\nLoop module start /*update the same row with table_1 many times*/\r\n\r\n\r\nfetch a row data from table_1\r\n\r\nupdate table_2\r\n\r\nLoop module end\r\n\r\nrelease semaphore\r\n\r\ncommit work\r\n\r\n------------------------------------------------------\r\n\r\n注:informix的锁机制能完成上述功能,无需使用信号量辅助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP