谢谢大家了

解决方案 »

  1.   

    还是要用flag,让你的阻塞线程退出循环等,比较合理,如果你线程里面合理,退出很快
      

  2.   

    关键看你是怎么阻塞的。如果是socket 阻塞,直接在其他线程中关闭socket .阻塞的socket 操作会失败返回。如果是用的等待函数,可以考虑用alertable 等待,其他线程通过APC让等待函数返回。当然,你也可以通过等待一个专门的对象来识别退出
      

  3.   

    sema,event,这些事件都可以达到结束线程的目的。
      

  4.   

    阻塞的话就只能TerminateThread了
      

  5.   

    最好是让线程自己reutrn返回,最安全
      

  6.   

    Windows终止线程运行的四种方法:
    终止线程运行  若要终止线程的运行,可以使用下面的方法:
      • 线程函数返回(最好使用这种方法)。
      • 通过调用 ExitThread 函数,线程将自行撤消(最好不要使用这种方法)。
      • 同一个进程或另一个进程中的线程调用 TerminateThread 函数(应该避免使用这种方法)。
      • 包含线程的进程终止运行(应该避免使用这种方法)。  下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。线程函数返回  始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。
      如果线程能够返回,就可以确保下列事项的实现:
      • 在线程函数中创建的所有 C++ 对象均将通过它们的撤消函数正确地撤消。
      • 操作系统将正确地释放线程堆栈使用的内存。
      • 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
      • 系统将递减线程内核对象的使用计数。使用 ExitThread 函数  可以让线程调用 ExitThread 函数,以便强制线程终止运行:
      VOID ExitThread(DWORD dwExitCode);  该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++ 资源(如 C++ 类对象)将不被撤消。由于这个原因,最好从线程函数返回,而不是通过调用 ExitThread 来返回。
      当然,可以使用 ExitThread 的 dwExitThread 参数告诉系统将线程的退出代码设置为什么。ExitThread 函数并不返回任何值,因为线程已经终止运行,不能执行更多的代码。使用 TerminateThread 函数  调用 TerminateThread 函数也能够终止线程的运行:
      BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);  与 ExitThread 不同,ExitThread 总是撤消调用的线程,而 TerminateThread 能够撤消任何线程。hThread 参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为 dwExitCode 参数传递的值。同时,线程的内核对象的使用计数也被递减。  注意 TerminateThread 函数是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。如果需要确切地知道该线程已经终止运行,必须调用 WaitForSingleObject 或者类似的函数,传递线程的句柄。
      

  7.   

    TerminateThread还是要谨慎用啊!不得已而用之