杀死线程库中的线程

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

首先存储线程ID

 pthread_create(&thr, ...) 

然后再打电话

 pthread_cancel(thr) 

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

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

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

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

(请注意,如果您已经使用pthread_detach()分离了线程,则无法使用pthread_join()再次join它。)

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

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

看看pthread_kill()函数。