为什么以及何时不应该杀死一个线程?

Pat*_*ski 6 c++ sockets networking multithreading

我正在编写一个多线程套接字服务器,我需要确定.

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

为什么杀死线程函数是危险的,什么时候它们会崩溃整个应用程序?

And*_*ron 18

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

因此,你的问题有点逆转.真正的问题应该是:

何时,在什么条件下我可以杀死一个线程?

所以,当你确信没有泄漏和死锁可以发生时,你可以杀死线程,而不是现在,而不是当其他线程的代码被修改时(因此,几乎不可能保证).


在您的特定情况下,解决方案是使用非阻塞套接字并在调用send()和之间检查一些线程/用户特定标志recv().这可能会使您的代码变得复杂,这可能是您拒绝这样做的原因,但这是正确的方法.

此外,您将很快意识到每个客户端的线程方法无法扩展,因此您将改变您的体系结构并重新编写大量的体系结构.

  • +1:在Windows中,我们最终都会以IO完成端口结束. (4认同)

Fer*_*cio 7

杀死一个线程会导致程序泄漏资源,因为该线程没有机会自行清理.考虑关闭线程发送的套接字句柄.这将导致阻塞send()立即返回适当的错误代码.然后线程可以清理并平静地死亡.

  • 光滑的解决方案,尽管如此. (2认同)

fra*_*ast 5

如果你以强硬的方式杀死你的线程,它可能会泄漏资源。

当您设计线程以支持取消时,您可以避免它。

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