代码之家  ›  专栏  ›  技术社区  ›  Pythagoras of Samos

我为什么什么时候不杀一根线?

  •  6
  • Pythagoras of Samos  · 技术社区  · 14 年前

    关于线程的文章说,我应该等待线程返回,而不是杀死它。不过,在某些情况下,我想踢/禁止的用户线程将无法正确返回(例如,我现在开始发送一大块数据,send()阻塞线程),所以我只需要杀死它。

    6 回复  |  直到 12 年前
        1
  •  18
  •   André Caron    12 年前

    杀死一个线程意味着停止所有的执行。尤其是,它不会执行任何析构函数。这意味着套接字和文件不会被关闭,动态分配的内存不会被释放,互斥锁和信号量不会被释放,等等。杀死线程几乎可以保证会导致资源泄漏和死锁。

    因此,你的问题有点颠倒了。真正的问题应该是:

    可以 我杀了一根线?

    因此,当确信不会发生泄漏和死锁时,您可以终止线程,而不是现在,也不是在修改另一个线程的代码时(因此,几乎不可能保证)。


    send() recv()

    此外,您将很快意识到每客户机线程方法不可扩展,因此您将更改您的体系结构,并无论如何重新编写大量的体系结构。

        2
  •  7
  •   Ferruccio    14 年前

        3
  •  4
  •   frast    14 年前

    如果你用硬方法杀死你的线程,它会泄露资源。

    在设计支持取消的线程时可以避免这种情况。

    不要使用阻塞呼叫或使用超时阻塞呼叫。以较小的块或异步方式接收或发送数据。

        4
  •  2
  •   Kevin Anderson    14 年前

        5
  •  2
  •   MarcH rhardih    14 年前

    如果一个线程在I/O中被阻塞,您不需要真正地杀死它,相反,您可以在非阻塞I/O、超时和从另一个线程关闭套接字之间进行选择。这两种方法都可以解除锁定线程。

        6
  •  2
  •   jcoder    14 年前

    你真的不想这么做。

    如果在线程保存关键部分时终止该线程,则不会释放该线程,这可能会导致整个应用程序崩溃。某些C库调用(如堆内存分配)使用关键部分,如果在线程执行“new”时碰巧终止线程,则从程序中的任何其他位置调用new都将导致该线程停止。

    不能 在没有极端措施的情况下安全地执行此操作,这些措施比简单地向线程发送终止其自身的信号更具限制性。