gpt4 book ai didi

c++ - 线程问题 : Control is not coming back to the caller

转载 作者:行者123 更新时间:2023-11-28 02:43:51 25 4
gpt4 key购买 nike

我遇到了关于共享资源的问题,我正在使用一个 mutex 进行同步。它在少量线程 [示例 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++;
}
}

谁能告诉我代码中可能有什么问题?

最佳答案

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

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

关于c++ - 线程问题 : Control is not coming back to the caller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com