今天与一个朋友讨论死锁的时候,我说,我简单写一个程序,验证一下.
一测不要紧,本应该死锁的程序,怎么不死锁了呢?
我们来看代码吧 
 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) 主线程
 (4492) 进入互斥体1
  (4492) 进入互斥体1
 (4492) 为什么还能再进入进入互斥体1,为什么不在这里死锁
  (4492) 为什么还能再进入进入互斥体1,为什么不在这里死锁
 (4492) 主线程2
  (4492) 主线程2