今天與一個朋友討論死鎖的時候,我說,我簡單寫一個程序,驗證一下.
一測不要緊,本應(yīng)該死鎖的程序,怎么不死鎖了呢?
我們來看代碼吧
?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)?進(jìn)入互斥體1\n"));
16?
????????logCritical();
17?
18?
????}
19?
????void?logCritical()
20?
????{
21?
????????ACE_GUARD(MUTEX,mon,mutex_);
22?
????????ACE_DEBUG((LM_DEBUG,"(%t)?為什么還能再進(jìn)入進(jìn)入互斥體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?

屏幕輸出的結(jié)果是
??(4492)?主線程
??(4492)?進(jìn)入互斥體1
??(4492)?為什么還能再進(jìn)入進(jìn)入互斥體1,為什么不在這里死鎖
??(4492)?主線程2