2013-10-16 48 views
1

我試圖用我自己的代MFC的CSingleLock執行結束,但我現在已經在Windows XP上的僵局,我沒有在Windows 7和我沒有在任何操作系統與MFC的CSingleLock,除了尋找到每一個鎖定&解鎖在我的應用程序,什麼是從我實現丟失:CSingleLock執行工作正常的Windows 7,但在Win XP的死鎖

class CCriticalSection 
{ 
    CRITICAL_SECTION m_cs; 
public: 
    CCriticalSection() 
    { 
     InitializeCriticalSection(&m_cs); 
    } 
    ~CCriticalSection() 
    { 
     DeleteCriticalSection(&m_cs); 
    } 
    void Lock() 
    { 
     EnterCriticalSection(&m_cs); 
    } 
    BOOL TryLock() 
    { 
     return TryEnterCriticalSection(&m_cs); 
    } 
    void Unlock() 
    { 
     if(m_cs.LockCount > -1) 
       LeaveCriticalSection(&m_cs); 
    } 
}; 

#include "CCriticalSection.h" 
class CSingleLock { 
    CCriticalSection *m_cs; 
public: 
    CSingleLock(CCriticalSection* cs = NULL, bool bLock = false) 
    { 
     m_cs = cs; 
     if(m_cs != NULL) 
     { 
      if(bLock) 
       m_cs->Lock(); 
     } 
    } 
    void Unlock() 
    { 
     if(m_cs != NULL) 
      m_cs->Unlock(); 
    } 
    void Lock() 
    { 
     if(m_cs != NULL) 
      m_cs->Lock(); 
    } 
    ~CSingleLock() 
    { 
     if(m_cs != NULL) 
      m_cs->Unlock(); 
    } 

}; 
+1

'1'任何不使用ATL/MFC類的原因['CComAutoCriticalSection'](http://msdn.microsoft.com/zh-cn/library/50yhb8t7%28v=vs.90%29.aspx)和朋友? '2',第二類是不準確的,例如它可能發生你解鎖沒有鎖定。方便的助手類不是以這種方式設計的。 –

+0

@RomanR。如果我在非商業項目上工作,我會避免使用ATL/MFC,因爲他們沒有使用VS Express。 (他們從來沒有使用過,無論如何,我沒有在2012年VS檢查) – arx

+0

@arx:這個問題被標記[標籤:MFC]和曾經問[標籤:ATL]海報在過去的問題。 –

回答

2

爲了鎖定類真正的幫助,你需要提高這樣的:

class CSingleLock 
{ 
    CCriticalSection *m_cs; 
    bool m_bLock; 

public: 
    CSingleLock(CCriticalSection* cs = NULL, bool bLock = false) 
    { 
     m_cs = cs; 
     if(m_cs != NULL) 
     { 
      if(bLock) 
       m_cs->Lock(); 
      m_bLock = bLock; 
     } 
    } 
    void Unlock() 
    { 
     if(!m_cs || !m_bLock) 
      return; 
     m_cs->Unlock(); 
     m_bLock = false; 
    } 
    void Lock() 
    { 
     if(!m_cs || m_bLock) 
      return; 
     m_cs->Lock(); 
     m_bLock = true; 
    } 
    ~CSingleLock() 
    { 
     Unlock(); 
    } 
}; 

它應該是足夠的智能,讓你不正確的CS使用麻煩了。

+0

非常感謝! – AlexandruC

+0

請注意,如果'cs'爲NULL,'m_bLock'未被構造函數初始化。 –

+0

@JonathanPotter:用'!m_cs','m_bLock'永遠不會被訪問。 –

1

MSDN說:「如果一個線程當它沒有ow時調用LeaveCriticalSection指定臨界區對象的臨近區域時,會發生錯誤,可能導致使用EnterCriticalSection的另一個線程無限期地等待。「

0123'的析構函數調用CriticalSection::Unlock,它調用LeaveCriticalSection,但沒有檢查臨界區是否由當前線程持有。

你需要跟蹤的關鍵部分的所有權。

+0

爲什麼我不能在Windows 7上發生死鎖? – AlexandruC

+0

我真的有你在你的答案所描述的情況..但我需要的CSingleLock對象是從多個線程訪問,因爲訪問一個共同的陣列結構 – AlexandruC

+0

它會阻止其他可能的線程也許它的僵局,你剛纔沒見過它還沒有或者可能以更有害的方式失敗(例如它不能保護共享資源)。沒關係,代碼被破壞了。更具建設性的是,如果CSingleLock是共享的,爲什麼析構函數調用解鎖? – arx

相關問題