多线程退出的方案问题。
还是更新模块问题,采用服务器和客户端模式,服务器使用线程池来等待连接客户端的连入请求。
问题是我在创建线程的时候没有保存线程句柄,而且线程池中线程数是动态变化的即如果客户端多的话线程也多(但是不超过最大线程限制),服务器如果长时间没有客户端连接的话线程就会退出一部分,只留几个线程来等待连接。
问题是如果我想终止服务器的时候,那么多的线程直接就异常退出,肯定会有很多堆栈内存没有释放。想用waitformultyobjects 来解决但是句柄数组不好弄,而且传输文件时间很长用这种方法意义不大感觉。
有好的方案吗大神们?求解
(别说用iocp了,小弟现在正在学习ing...) 多线程 服务器
[解决办法]
你这个需求 顺序应该是
线程池的子线程结束->线程池结束->主线程结束程序退出
有一个g_Exit,为true表示主线程想退出了
然后创建Event
g_hThreadPoolExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleObject(g_hThreadPoolExitEvent, INFINITE);
对于非阻塞的模型 线程池创建的线程应该是
while(!g_Exit)
{
//do something;
sleep(1);
}
然后线程池在所有线程退出之后 就是检测到线程个数为0的时候
SetEvent(g_hThreadPoolExitEvent);
如果你是阻塞模型 那就直接强退吧
[解决办法]