我正面临共享资源的问题,我正在使用一个mutex
进行同步。使用少量threads
[示例10个线程]它正常工作,但是如果我尝试使用更多线程,我会遇到问题“control is not coming back”
(可能是因为死锁)[例60线程]
注意:代码是遗留代码,用VC6编写,我正在维护代码。
解释 我有多个设备之间可以共享的全局数据,因为我正在使用锁定和解锁功能,如下所示......
inline LONG SharedData::Lock()
{
return WaitForSingleObject(m_hMutex, INFINITE );
}
inline BOOL SharedData::Unlock()
{
return ReleaseMutex(m_hMutex);
}
我怀疑析构函数导致了一些问题,下面是析构函数......
SharedData::~ SharedData()
{
Lock();
try
{
m_lShareCnt--;
if (m_lShareCnt < 1)
{
//clearing the heap
}
}
Catch(…) { }
Unlock();
if (!m_lShareCnt)
{
if(m_hMutex != NULL && m_hMutex != INVALID_HANDLE_VALUE )
{
CloseHandle(m_hMutex);
m_hMutex=NULL;
}
}
return;
}
构造函数如下
SharedData:: SharedData ()
{
try
{
if (!m_hMutex) m_hMutex = CreateMutex(NULL, FALSE, NULL);
m_lShareCnt++;
}
}
有人可以告诉代码中可能有什么问题吗?
答案 0 :(得分:2)
我认为一个问题是参考计数器m_lShareCnt
上的竞争条件,它不是原子的。如果非原子变量被多个线程同时修改,那么它的值可能是意外的。
解决方案是使引用计数器处于原子状态,或者仅使用已使用的互斥锁保护对此变量的访问。由于您使用的是古老的VC6,因此最简单的方法是使用InterlockedIncrement
和InterlockedDecrement
方法进行原子读/写。