在Pthread库中杀死线程

时间:2010-01-18 09:00:10

标签: c multithreading pthreads posix

我使用pthread_create(&thread1, &attrs, //... , //...);并且如果发生某些情况需要杀死此线程如何杀死它?

5 个答案:

答案 0 :(得分:55)

首先存储线程ID

pthread_create(&thr, ...)

然后再打电话

pthread_cancel(thr)

然而,这不是推荐的编程习惯!最好使用信号量或消息之类的线程间通信机制来与线程通信它应该停止执行。

请注意,pthread_kill(...)实际上不会终止接收线程,而是向其发送信号,并且它取决于信号和信号处理程序会发生什么。

答案 1 :(得分:22)

这个问题有两种方法。

  • 使用信号:线程使用设置标志的sigaction()安装信号处理程序,并且线程会定期检查该标志以查看它是否必须终止。线程必须终止时,使用pthread_kill()向其发出信号,并等待pthread_join()终止。这种方法需要父线程和子线程之间的预同步,以保证子线程在能够处理终止信号之前已经安装了信号处理程序;
  • 使用取消点:只要执行取消功能,线程就会终止。当线程必须终止时,执行pthread_cancel()并等待pthread_join()终止。此方法需要详细使用pthread_cleanup_push()pthread_cleanup_pop()以避免资源泄漏。最后两次调用可能会破坏代码的词法范围(因为它们可能是生成{}令牌的宏)并且很难正确维护。

(请注意,如果您已使用pthread_detach()分离了该主题,则无法使用pthread_join()再次加入该主题。)

这两种方法都非常棘手,但在特定情况下可能特别有用。

答案 2 :(得分:6)

我同意Antti,更好的做法是实现一些检查点,其中线程检查它是否应该终止。这些检查点可以通过多种方式实现,例如:带锁的共享变量或线程检查是否设置的事件(线程可以选择等待零时间)。

答案 3 :(得分:2)

查看pthread_kill()功能。

答案 4 :(得分:-1)

pthread_exit(0) 

这会杀死线程。