今天與一個朋友討論死鎖的時候,我說,我簡單寫一個程序,驗證一下.
一測不要緊,本應該死鎖的程序,怎么不死鎖了呢?
我們來看代碼吧

屏幕輸出的結果是
??(4492)?主線程
??(4492)?進入互斥體1
??(4492)?為什么還能再進入進入互斥體1,為什么不在這里死鎖
??(4492)?主線程2
一測不要緊,本應該死鎖的程序,怎么不死鎖了呢?
我們來看代碼吧
?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?
?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?

屏幕輸出的結果是



