CCriticalSection锁定问题 [英] CCriticalSection Locking problem
问题描述
你好
我正在MFC中开发一个多线程应用程序.我使用CCriticalSection对象进行互斥.我已经意识到,有时2个线程可以访问同一对象.以下代码检查那里是否没有其他线程在工作.如果是这样,我让 应用程序崩溃.如果在WinDBG中进行调试,则可以看到CRITICAL_SECTION对象的成员. LockCount ist 2,并且拥有的线程不是我的!这怎么可能?
I am developing a multithreaded application in MFC. I use a CCriticalSection object for mutual excusion. I have realised, that sometimes 2 threads gain the access to the same object. Following code checks if no other thread is working there. If so, I let the application crash. If I debug in WinDBG I can see the members of CRITICAL_SECTION object. The LockCount ist 2, and the owning thread is other than mine! How could this be possible?
Bronjek
void CRef :: Lock()
void CRef::Lock()
{
//CCriticalSection :: Lock始终返回TRUE
// CCriticalSection::Lock allways returns TRUE
布尔bRet = m_csLock.Lock();
BOOL bRet = m_csLock.Lock();
m_dLockCount ++;
m_dLockCount++;
如果(0 == m_dLasLockThreadId)
if (0 == m_dLasLockThreadId)
{
{
m_dLasLockThreadId = GetCurrentThreadId();
m_dLasLockThreadId = GetCurrentThreadId();
}
}
否则((0< m_dLockCount)&&(m_dLasLockThreadId!= GetCurrentThreadId()))
else if ((0 < m_dLockCount) && (m_dLasLockThreadId != GetCurrentThreadId()))
{
{
//导致空指针异常
*((long *)NULL)= 0;
*((long *) NULL) = 0;
}
}
};
void CRef :: Unlock()
void CRef::Unlock()
{
如果(m_dLockCount< = 0)
if (m_dLockCount <= 0)
{
//导致空指针异常
*((long *)NULL)= 0;
*((long *) NULL) = 0;
}
m_dLockCount-;
m_dLockCount--;
如果(m_dLasLockThreadId!= GetCurrentThreadId())
if (m_dLasLockThreadId != GetCurrentThreadId())
{
{
//导致空指针异常
*((long *)NULL)= 0;
*((long *) NULL) = 0;
}
}
如果(0 == m_dLockCount)m_dLasLockThreadId = 0;
if (0 == m_dLockCount) m_dLasLockThreadId = 0;
布尔bRet = m_csLock.Unlock();
BOOL bRet = m_csLock.Unlock();
};
推荐答案
我认为这是您代码中的错误.
I think it is a bug in your code.
考虑顺序:
线程1:
lock()
线程2:
lock(),
这本身将触发您在上面描述的情况.
This itself will trigger the condition you describe above.
在知道要允许锁定之前,您正在递增m_dLockCount.因此,当线程2要求锁定时,count可以为2,这将触发您的异常.
You are incrementing the m_dLockCount, before you know that you want to allow the locking. Thus, count can be 2, while thread 2 is asking for the lock, which triggers your exception.
只需从最后一个if中删除锁计数检查即可.
Just remove the lock count check from the last else if.
更改:
否则((0< m_dLockCount)&&(m_dLasLockThreadId!= GetCurrentThreadId()))
else if ((0 < m_dLockCount) && (m_dLasLockThreadId != GetCurrentThreadId()))
收件人:
否则((m_dLasLockThreadId!= GetCurrentThreadId())
else if (m_dLasLockThreadId != GetCurrentThreadId())
///例外
其他
m_dLockCount ++;
m_dLockCount++;
谢谢
拉胡尔
这篇关于CCriticalSection锁定问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!