none
子线程执行read操作阻塞时,父线程如何结束子线程? RRS feed

  • 问题

  • 网络服务器程序中,服务器监听到有新的连接后就开一个新的子线程去处理相关操作。在子线程中,执行tcp.GetStream.read去读取远程host的数据。

    子线程的框架是:

    try
    
    {
    
      while(true)
    
      {
    
        string buffer = tcp.GetStream.read();
    
        ......
    
      }
    }
    catch(Exception e)
    
    {
    
      .....
    
    }
    
    finally
    
    {
    
      tcp.GetStream.close();
    
      tcp.close();
    
    }
    
    
    

    当服务器监听线程想结束子线程时,我在监听线程中调用如下语句:

    childThread.Abort();
    
    childThread.Join();
    
    
    

    但是经调试发现,abort不能结束子线程,子线程仍然阻塞在read调用处。 然后监听线程也阻塞在Join调用处。

    请问各位有什么办法可以解决上面的问题吗?谢谢

     

    2011年3月10日 2:28

答案

全部回复

  • 可以直接关闭连接套接字,这样可以引发Read语句的异常,在异常中跳出循环,结束线程.
    • 已标记为答案 Cookie Luo 2011年3月16日 14:04
    2011年3月10日 4:48
  • 网络服务器程序中,服务器监听到有新的连接后就开一个新的子线程去处理相关操作。在子线程中,执行tcp.GetStream.read去读取远程host的数据。

    子线程的框架是:

    try
    
    
    
    {
    
    
    
     while(true)
    
    
    
     {
    
    
    
      string buffer = tcp.GetStream.read();
    
    
    
      ......
    
    
    
     }
    
    }
    
    catch(Exception e)
    
    
    
    {
    
    
    
     .....
    
    
    
    }
    
    
    
    finally
    
    
    
    {
    
    
    
     tcp.GetStream.close();
    
    
    
     tcp.close();
    
    
    
    }
    
    
    
    
    
    

    当服务器监听线程想结束子线程时,我在监听线程中调用如下语句:

    childThread.Abort();
    
    
    
    childThread.Join();
    
    
    
    
    
    

    但是经调试发现,abort不能结束子线程,子线程仍然阻塞在read调用处。 然后监听线程也阻塞在Join调用处。

    请问各位有什么办法可以解决上面的问题吗?谢谢

     

    因为abort 处事给子线程产生一个exception 通过exception来中断

    子线程只有在非阻塞状态下可以响应

    所以让阻塞线程的组件主动抛出exception是最好的办法


    入了ipad,最近用ipad上论坛
    2011年3月10日 5:20
  • 谢谢,那么如你所说,在上例中让阻塞线程主动抛出异常的方法,就是在父线程中持有子线程的socket的引用,并在父线程中关闭socket了?

     

     

    2011年3月10日 15:22
  • 谢谢,那么如你所说,在上例中让阻塞线程主动抛出异常的方法,就是在父线程中持有子线程的socket的引用,并在父线程中关闭socket了?

     

     


    是的 所以雪一笑答案是正确的。

    当然 我们强烈建议不用阻塞模式来编写socket程序。:P


    入了ipad,最近用ipad上论坛
    2011年3月11日 7:07
  • 谢谢,那么您的意思是最好用非阻塞模式来完成socket程序了?比如poll。有什么推荐的资料吗?我可能比较初级, 看的书上都是阻塞模式的。

    2011年3月23日 3:39