线程问题:控制不会回到调用者

时间:2014-07-31 14:16:26

标签: c++ multithreading

我正面临共享资源的问题,我正在使用一个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++;
    }
}

有人可以告诉代码中可能有什么问题吗?

1 个答案:

答案 0 :(得分:2)

我认为一个问题是参考计数器m_lShareCnt上的竞争条件,它不是原子的。如果非原子变量被多个线程同时修改,那么它的值可能是意外的。

解决方案是使引用计数器处于原子状态,或者仅使用已使用的互斥锁保护对此变量的访问。由于您使用的是古老的VC6,因此最简单的方法是使用InterlockedIncrementInterlockedDecrement方法进行原子读/写。