15,471
社区成员
发帖
与我相关
我的任务
分享
//程序退出保证所有子线程结束
static HANDLE s_ListenHandle;
//引用计数,默认是0
static int s_ListenCount = 0;
static CRITICAL_SECTION s_csListen;
void ResetUserHandle()
{
EnterCriticalSection(&s_csListen);
if(s_ListenCount == 0)
{
ResetEvent(s_ListenHandle);
}
++s_ListenCount; //引用计数加1
LeaveCriticalSection(&s_csListen);
}
void SetUserHandle()
{
EnterCriticalSection(&s_csListen);
--s_ListenCount;//引用计数减1
if (s_ListenCount == 0)
{
SetEvent(s_ListenHandle);
}
LeaveCriticalSection(&s_csListen);
}
//线程函数的开始处调用ResetUserHandle(), 线程函数退出的地方调用SetUserHandle()
//onclose里面这样调用:
DWORD ret = WaitForSingleObject(s_ListenHandle, 20000);//等待所有的子线程退出
if (ret == WAIT_TIMEOUT)
{
CDebug::Log("等待了20秒, 还有子线程没有退出");
}
else if (ret == WAIT_OBJECT_0)
{
CDebug::Log("所有子线程都退出了");
}
刚好我之前做的一个项目里面就有这个问题, 使用事件+引用计数来处理