主线程有个不好的习惯,就是喜欢同归于尽,它在退出时就会调用ExitProcess来结束整个进程。你用同步机制处理一下吧,三言两语说不清楚,自己看看书问问人吧。我只会一点点啦,不要问我。

解决方案 »

  1.   

    用一个全局变量,就能搞定。在置值后,主线程sleep几秒就能ok了。
      

  2.   

    比较简单的方法是为每个线程传递一个bool参数,在while循环中检查这个bool参数,如果为false就退出while(true),但这样你就必须保持一个bool参数和线程句柄的列表,比较好的方法是使用同步机制,可以用event或其它的同步方法,不过你要有一定的同步方面的知识,可以参看一些操作系统方面的书
      

  3.   

    to james_razor(蹬三轮的)这样有什么理论根据吗?
    大家帮我看一下上面的服务器端监听程序.当我在主线程里调用WSACleanup()函数后,好像执行不到break语句了.
      

  4.   

    理论?哪儿有,书上有?书上可不会说这些边边角角的细节(有我也没看到过),我只知道如果主线程成功调用了ExitProcess,所有其它的线程就无疾而终了。到是因为其他的原因如:一个线程将变量过早释放,而其它线程仍试图访问造成的非法操作。当然这只是同步的问题。
      

  5.   

    谢谢james_razor(蹬三轮的)了,通过我上午的调试觉得你讲的是对的了,呵呵.如果在退出的时候我不管监听线程(让主线程退出就行了)没什么问题,如果加入一些同步机制反而执行不到,老出现非法操作.哎.........有时候还识别想得太多:)
      

  6.   

    同步问题是个大问题,许多资深的程序员还往往为此所困,《Windows高级编程》的作者Jeffery Richter你该知道吧,他也承认他在第二版的《Windows高级编程》中的一个程序有同步的错误,在第三版才做了修正,所以这些问题要靠扎实的理论基础和丰富的实际经验来解决,缺一不可,即使是这样,也不能保证完全没有问题。我没到这种境界,所以我的程序老出问题(要不然也不会靠蹬三轮糊口,呵呵)。
      

  7.   

    kao ,抢我生意绝对不行!
      

  8.   

    我看不太懂,但我觉得你不用CSokcet类,而用CAsyncSocket就不需要多线程了。
      

  9.   

    你在退出主线程前,可以通过调用GetExitCode()查看线程是否退出,如果没有退出就调用ExitThread() 或 TerminateThread() 强制退出线程。应当不要用到同步问题
      

  10.   

    争得好热闹啊。我觉得lu_zi和james_razor说得都对!
      

  11.   

    我也是新手,我说说我的理解吧:
    在windows下,一个程序启动后,windows会为其创建一个进程和一个主线程,这个主线程就是
    你程序的入口函数,程序的启动会执行c++的运行库启动函数,启动函数初始化后才调用你程序
    的入口函数,入口函数执行完后会返回给c++运行库启动函数的代码,它做一些清除工作并且
    调用ExitProcess,撤销你的进程,ExitProcess被调用时你程序中所有的进程都会被撤销,这也是为什么主线程函数执行完后会撤销所有线程的原因,但是如果你的入口函数中调用了ExitThread函数(vc++提供有自己的支持函数_endthreadex只不过做了一些附加的工作),你
    的主线程会终止运行,但是其它线程可以照常工作(不过ExitThread会撤销主线成的堆栈,如果其它线程访问到主线程得堆栈的话,也会产生异常),进程不会终止,直到所有线程都退出才会
    被撤销。所以我觉得如果上面的代码是在你程序的入口函数中被调用的话,你的程序在其他线程
    终止之前不会撤销,不过这样做会造成问题,因为你主线程因为_endthreadex推出后,c++运行时
    库启动代码不会再次获得控制,不能完成清理工作,有可能会造成问题。
      

  12.   

    同意lu_zi的。
    设个全局bool变量。线程们都判断它。主线程退出前,设bool变量为true
    然后一直while到所有 线程 都退出了。