当前位置: 代码迷 >> C++ >> 多线程退出的方案有关问题
  详细解决方案

多线程退出的方案有关问题

热度:2005   发布时间:2013-02-26 00:00:00.0
多线程退出的方案问题。
还是更新模块问题,采用服务器和客户端模式,服务器使用线程池来等待连接客户端的连入请求。
问题是我在创建线程的时候没有保存线程句柄,而且线程池中线程数是动态变化的即如果客户端多的话线程也多(但是不超过最大线程限制),服务器如果长时间没有客户端连接的话线程就会退出一部分,只留几个线程来等待连接。
问题是如果我想终止服务器的时候,那么多的线程直接就异常退出,肯定会有很多堆栈内存没有释放。想用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);

如果你是阻塞模型 那就直接强退吧
------解决方案--------------------------------------------------------
引用:
你这个需求 顺序应该是 
线程池的子线程结束->线程池结束->主线程结束程序退出
有一个g_Exit,为true表示主线程想退出了
然后创建Event
g_hThreadPoolExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleObject(g_hThreadPoolExitEvent……


WaitForSingleObject也可以直接等待线程句柄,不需要用CreateEvent(),SetEvent()吧!
WaitForSingleObject与WaitForMultipleObjects应该可以等待几乎所有window内核对象;
CreateEvent()返回的也是一个Handle,CreateThread()返回的也是一个Handle,都是window的内核对象。
------解决方案--------------------------------------------------------
不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!

------解决方案--------------------------------------------------------
引用:
引用:你这个需求 顺序应该是 
线程池的子线程结束->线程池结束->主线程结束程序退出
有一个g_Exit,为true表示主线程想退出了
然后创建Event
g_hThreadPoolExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleOb……


那你线程时阻塞的话 没法让线程执行到return的情况下 那只能强退了啊
或者你换成非阻塞模型 
  相关解决方案