先仔细阅读这道题。
有一个工作线程是从CreateInstance of CTest类派生的。这是这个类的原型。hThread是线程的句柄,hEventShutdown是程序退出时关闭线程的事件。WaitForShutdown是一个公共函数,用于向hEventShutdown发送信号,并等待句柄到线程正常退出。从应用程序的出口调用WaitForShutdown。
//pseudocode
CTest
{
public:
CTest* CreateInstance();
static threadproc(void *pv);
void WaitForShutdown();
public:
HANDLE hThread;
HANDLE hEventShutdown;
}
void CTest::CTest* CreateInstance()
{
// spawn a thread, pass 'this' pointer to thread , use beginthreadex
hThread = beginthreadex ( threadproc, this );
}
unsigned int CTest::threadproc( void *pv)
{
Ctest *ptest = (Ctest*)pv;
do
{
HANDLES hArray[2] = { pv->hEventShutdown, someotherhandle }
dwResult = Waitformultipleobjects( hArrary , 2);
if ( dwResult == WAIT_OBJECT_0)
delete pTest; // since it is allocated dynamically ( This is required due to some known reasons in my code)
if(dwResult == WAIT_OBJECT_0 + 1)
Doprocessing(); //DoProcessing when other thread signal someotherhandle
}while (1)
void CTest::WaitForShutdown()
{
SetEvent ( hEventShutdown);
WaitForSingleObject ( hThread,INFINITE);
}
void CTest::~CTest()
{
Closehandle(hThread)
Closehandle(hEventShutdown);
}现在,如果仔细查看代码,您会发现事件是从WaitForShutdown函数发出的信号,线程从WaitForMultipleOjbects中出来,并删除CTest的指针。这意味着调用CTest的析构函数,这将明显关闭线程句柄( hThread)。但是,来自WaitForShutdown的WaitForShutdown实际上在等待线程句柄。因此,这里的行为将是不明确的(我认为是的,如果我错了,你可以纠正我)。另一个问题是在WaitForSingleObject等待其成员hThread时调用Ctest的析构函数,这是不正确的。由于某些原因,我不能删除线程中的pTest,因为它必须在线程中。
你将如何提出解决上述问题的办法?
我能想到的几种解决方案:
纠正我。
你的反馈很感激。
发布于 2011-07-06 17:52:39
处理这一问题的最简单方法是,在WaitForShutdown返回之后,简单地从WaitForSingleObject中删除线程。这确保了您所需要的所有句柄-更重要的是,对象本身-始终活着。
发布于 2011-07-06 21:00:41
我按原样写了这篇文章。看上去很管用,而且不会坠毁。奇怪的是,在我们离开CloseHandle(hthread)之前,我们可以调用WaitforSingleObject(hThread,INFINITE)。当然,连接线程的“学术性”方式首先是WaitForSingleObject(hThread,INFINITE)而不是CloseHandle(hThread)。所以这就是我的建议-这样做。
我不用再加了。
https://stackoverflow.com/questions/6600670
复制相似问题