杀死线程在pthread库

问题描述:

我用pthread_create(&thread1, &attrs, //... , //...);并需要如果发生某种情况需要杀死这个线程如何杀死这个?杀死线程在pthread库

第一家门店线程ID

pthread_create(&thr, ...) 

然后再打

pthread_cancel(thr) 

然而,这不是建议的编程习惯!最好使用线程间通信机制(如信号量或消息)来与线程通信以停止执行。

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

+4

pthread_cancel的问题是,如果你使用它,那么在被取消的线程中运行的代码必须理解取消点,并确保(a)它足够频繁地击中一个,以至于它实际上被取消时间,以及(b)在发生这种情况时不会泄漏资源。这是一种棘手的问题,而如果你使用了一条消息,那么当你的代码完全可以在线程退出的时候显式地显示出来。 – 2010-01-18 11:07:56

+11

@Steve:不幸的是,'pthread_cancel'是库代码*中唯一干净的方式,用于中断可能在系统调用中阻塞的线程。另一种方法是安装中断信号处理程序,并确保所有代码都已准备好处理'EINTR',但库代码不能假定它有权更改信号处理或对调用方施加EINTR处理。 – 2011-03-24 17:08:03

查看pthread_kill()函数。

+2

这不杀死任何线程,它只是发送一个信号。 – alk 2014-11-22 11:53:36

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

有两种解决这个问题的方法。

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

(请注意,如果你已经脱离使用pthread_detach()线程,则不能再次使用pthread_join()加入。)

这两种方法都可以很棘手,但无论哪种可能是在特定情况下特别有用。

pthread_exit(0) 

这会杀死线程。