我的代码如下,Ax内部的ASSERT没报错, 但程序退出时Lock报错,此时m_nCount等于0
class Ax
{
public:
Ax(CSingleLock* psl)
: m_psl(psl)
{
BOOL b = m_psl->Lock(); // ASSERT(b);
InterlockedIncrement(&m_nCount);
}
~Ax()
{
BOOL b = m_psl->Unlock();
ASSERT(b);
InterlockedDecrement(&m_nCount);
}
protected:
Ax();
CSingleLock* m_psl;
static long m_nCount;
};long Ax::m_nCount = 0;下面这个函数供多个线程调用
void CDbgLogWnd::SendDbgLog(PRIVATE_DBG_LEVEL nLevel, TCHAR *buffer)
{ if (!m_pwndDbgLog || !m_pwndDbgLog->GetSafeHwnd() || !::IsWindow(m_pwndDbgLog->GetSafeHwnd()))
return;
ASSERT(nLevel < MAX_DBG_LEVEL);
Ax _ax(&m_pwndDbgLog->m_dbgLogLock);//CSingleLock(&CMutex ...)
...
}程序退出时会报下面红字的ASSERT错误,请问是什么原因?
BOOL CSingleLock::Lock(DWORD dwTimeOut /* = INFINITE */)
{
ASSERT(m_pObject != NULL || m_hObject != NULL);
ASSERT(!m_bAcquired); m_bAcquired = m_pObject->Lock(dwTimeOut);
return m_bAcquired;
}
class Ax
{
public:
Ax(CSingleLock* psl)
: m_psl(psl)
{
BOOL b = m_psl->Lock(); // ASSERT(b);
InterlockedIncrement(&m_nCount);
}
~Ax()
{
BOOL b = m_psl->Unlock();
ASSERT(b);
InterlockedDecrement(&m_nCount);
}
protected:
Ax();
CSingleLock* m_psl;
static long m_nCount;
};long Ax::m_nCount = 0;下面这个函数供多个线程调用
void CDbgLogWnd::SendDbgLog(PRIVATE_DBG_LEVEL nLevel, TCHAR *buffer)
{ if (!m_pwndDbgLog || !m_pwndDbgLog->GetSafeHwnd() || !::IsWindow(m_pwndDbgLog->GetSafeHwnd()))
return;
ASSERT(nLevel < MAX_DBG_LEVEL);
Ax _ax(&m_pwndDbgLog->m_dbgLogLock);//CSingleLock(&CMutex ...)
...
}程序退出时会报下面红字的ASSERT错误,请问是什么原因?
BOOL CSingleLock::Lock(DWORD dwTimeOut /* = INFINITE */)
{
ASSERT(m_pObject != NULL || m_hObject != NULL);
ASSERT(!m_bAcquired); m_bAcquired = m_pObject->Lock(dwTimeOut);
return m_bAcquired;
}
将你调用Lock的代码贴出来
{
CSingleLock lokc(m_mutex);
// your code here
}
你一旦保存和传递这个对象,必然造成问题。而从你代码看,他显然被你当作成员变量保存了
1. 线程1调用Lock,修改了m_bAcquired,但是还没有修改m_nCount就被线程2抢了CPU
2。线程2再调用lock就出现这种问题总之这是你用法错误,还是好好理解一下single lock干吗再说