免费注册 查看新帖 |

Chinaunix

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

超难解决死锁问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-17 13:22 |只看该作者 |倒序浏览
如果有多个进程共享同一把锁,每个进程对该锁均有加锁解锁操作,但是如果其中一个进程在加锁后异常退出,没有释放该锁,那么其它进程在lock该锁的时候,就会阻塞住,永远也不会加锁成功!

不知道各位对这个问题有什么好的解法!!

论坛徽章:
0
2 [报告]
发表于 2003-11-17 13:32 |只看该作者

超难解决死锁问题!

如此简单的问题,请不要用这种词汇哗众取宠,OK?

论坛徽章:
0
3 [报告]
发表于 2003-11-17 14:11 |只看该作者

超难解决死锁问题!

orient类库的处理线程锁方法(利用析构函数,你只要管锁定就行了):

  1. class TThread_Safe
  2. {
  3. private:
  4.   TThread_Lock * mLock;
  5.   int mIs_Locked;
  6.   
  7. public:
  8.   TThread_Safe(TThread_Lock * obj);
  9.   
  10.   ~TThread_Safe();

  11.   int Lock(TThread_Lock * obj);
  12.   int Unlock();
  13. };

  14. TThread_Safe::TThread_Safe(TThread_Lock * obj)
  15. {
  16.   mIs_Locked=0;
  17.   mLock=obj;
  18.   Lock(mLock);
  19. };

  20. TThread_Safe::~TThread_Safe()
  21. {
  22.   if(mIs_Locked)
  23.     mLock->;Unlock();
  24. };

  25. int TThread_Safe::Lock(TThread_Lock * obj)
  26. {
  27.   if(mIs_Locked) return 1;
  28.   if(obj==NULL) return 1;
  29.   mLock=obj;
  30.   mLock->;Lock();
  31.   mIs_Locked=1;
  32.   return 1;
  33. };

  34. int TThread_Safe::Unlock()
  35. {
  36.   if(mLock==NULL) return 1;
  37.   mLock->;Unlock();
  38.   mIs_Locked=0;
  39.   return 1;
  40. };
复制代码


EXAM:

  1. int TBTree_T::Erase_Item(TBTree_ItemP item)
  2. {
  3.   TThread_Safe lock(mLock);
  4.   return TBTree::Erase_Item(item);
  5. };
复制代码

论坛徽章:
0
4 [报告]
发表于 2003-11-17 14:29 |只看该作者

超难解决死锁问题!

但是如果因为程序core dump而没有调用析构函数呢?

论坛徽章:
0
5 [报告]
发表于 2003-11-17 14:44 |只看该作者

超难解决死锁问题!

[quote]原帖由 "BingbingNorth"]但是如果因为程序core dump而没有调用析构函数呢?[/quote 发表:

先解决 core dump 的问题  

论坛徽章:
0
6 [报告]
发表于 2003-11-17 15:47 |只看该作者

超难解决死锁问题!

[quote]原帖由 "river_wave"]如此简单的问题,请不要用这种词汇哗众取宠,OK?[/quote 发表:


大哥,你有没有实际经验,你说说你的解决办法!加锁后退出的那个进程,是异常退出,可能连core都没有!!

论坛徽章:
0
7 [报告]
发表于 2003-11-17 16:17 |只看该作者

超难解决死锁问题!

建议使用 netlock
可以解决这个问题

论坛徽章:
0
8 [报告]
发表于 2003-11-17 16:26 |只看该作者

超难解决死锁问题!

楼上的,能详细的说一说吗,多谢了!!

论坛徽章:
0
9 [报告]
发表于 2003-11-17 16:44 |只看该作者

超难解决死锁问题!

netlock是我的杜撰,估计查不到。
我的想法: 编写一个网络服务程序,接受来自各程序的连接,集中进行锁
的管理,用来实现进程间信号灯。
这个程序是为了提供跨机器进行同步的问题。正好也能解决你的问题。因为
程序异常退出来服务进程能检测到。

论坛徽章:
0
10 [报告]
发表于 2003-11-17 16:53 |只看该作者

超难解决死锁问题!

喔,你的想法很好,但是我想只有涉及到不同机器间的同步用这种比较合适,如果在一台主机上,涉及不到网络间同步问题,这样用法就太浪费了,也较复杂,在一台机器上的不同进程间通讯,就是直接用pthread_mutex_lock比较合适,但是就是不太好解决死锁问题,不知道有什么手段,如果发生死锁的时候,能恢复程序运行!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP