Focus on ACE

订阅 ace-china
电子邮件:
浏览存于 groups.google.com 上的所有帖子

C++博客 首页 新随笔 联系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks
今天与一个朋友讨论死锁的时候,我说,我简单写一个程序,验证一下.
一测不要紧,本应该死锁的程序,怎么不死锁了呢?

我们来看代码吧

 1 // testMutex.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "ACE/Thread_Mutex.h"
 6 #include "ACE/Log_Msg.h"
 7 #include "ACE/Guard_T.h"
 8 typedef ACE_Thread_Mutex MUTEX;
 9 class Logger
10 {
11 public:
12     void log(void)
13     {
14         ACE_GUARD(MUTEX,mon,mutex_);
15         ACE_DEBUG((LM_DEBUG,"(%t) 进入互斥体1\n"));
16         logCritical();
17 
18     }
19     void logCritical()
20     {
21         ACE_GUARD(MUTEX,mon,mutex_);
22         ACE_DEBUG((LM_DEBUG,"(%t) 为什么还能再进入进入互斥体1,为什么不在这里死锁\n"));
23     }
24 private:
25     MUTEX mutex_;
26 };
27 
28 
29 int ACE_TMAIN(int argc, _TCHAR* argv[])
30 {
31     ACE_DEBUG((LM_DEBUG,"(%t) 主线程\n"));
32 
33     Logger l;
34     l.log();  //影响不在这里死锁呢
35 
36    ACE_DEBUG((LM_DEBUG,"(%t) 主线程2\n"));
37     return 0;
38 }
39 
40 

屏幕输出的结果是

  (4492) 主线程
  (4492) 进入互斥体1
  (4492) 为什么还能再进入进入互斥体1,为什么不在这里死锁
  (4492) 主线程2


posted on 2006-07-09 22:56 Stone Jiang 阅读(2008) 评论(3)  编辑 收藏 引用 所属分类: ACE

Feedback

# re: 再次获得互斥体,为什么没有死锁 2006-07-11 09:01 alvin.msg@gmail.com
不都在同一线程里,当然可以重复获锁了!你这个未必太低级错误了吧!  回复  更多评论
  

# re: 再次获得互斥体,为什么没有死锁 2006-08-31 09:42 slay78
你这段代码在win32上面不会死锁,win32下面这个锁实现为critical_section,
这是个递归锁,把你这段代码放到linux下面试试看,保证死锁  回复  更多评论
  

# re: 再次获得互斥体,为什么没有死锁 2015-09-10 17:48 hai
@slay78
II楼 正解,linux 上不想死锁,可以用ACE_Recursive_Thread_Mutex  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理