首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject问题

WaitForSingleObject问题
EN

Stack Overflow用户
提问于 2011-07-06 17:40:24
回答 2查看 4.3K关注 0票数 1

先仔细阅读这道题。

有一个工作线程是从CreateInstance of CTest类派生的。这是这个类的原型。hThread是线程的句柄,hEventShutdown是程序退出时关闭线程的事件。WaitForShutdown是一个公共函数,用于向hEventShutdown发送信号,并等待句柄到线程正常退出。从应用程序的出口调用WaitForShutdown。

代码语言:javascript
复制
//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,因为它必须在线程中。

你将如何提出解决上述问题的办法?

我能想到的几种解决方案:

  1. 我可以将线程句柄保存在另一个映射中,但我不想这样做。
  2. 可以在WaitForShutdown中的WaitForSingleObject之前将线程句柄复制到某个局部变量,然后等待它。不知道是吗?您告诉我.
  3. 或我将使用Duplicatehandle在WaitForSingleObject之前获取现有线程句柄的引用并等待它。不知道它是正确的。不知道复制句柄是否在原来的CloseHandle之后是活动的。
  4. I将保留线程ID,从线程ID获取线程句柄,并在WaitForShutdown中继续等待线程句柄。这看起来更优雅,但我不知道是否有任何方法从线程id获得句柄。

纠正我。

你的反馈很感激。

EN

回答 2

Stack Overflow用户

发布于 2011-07-06 17:52:39

处理这一问题的最简单方法是,在WaitForShutdown返回之后,简单地从WaitForSingleObject中删除线程。这确保了您所需要的所有句柄-更重要的是,对象本身-始终活着。

票数 2
EN

Stack Overflow用户

发布于 2011-07-06 21:00:41

我按原样写了这篇文章。看上去很管用,而且不会坠毁。奇怪的是,在我们离开CloseHandle(hthread)之前,我们可以调用WaitforSingleObject(hThread,INFINITE)。当然,连接线程的“学术性”方式首先是WaitForSingleObject(hThread,INFINITE)而不是CloseHandle(hThread)。所以这就是我的建议-这样做。

我不用再加了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6600670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档