在Pthread库中杀死线程

Saj*_*ani 39 c multithreading posix pthreads

我使用pthread_create(&thread1, &attrs, //... , //...);并需要一些条件发生需要杀死这个线程如何杀死这个?

Ant*_*ima 55

首先存储线程ID

pthread_create(&thr, ...)
Run Code Online (Sandbox Code Playgroud)

后来打电话

pthread_cancel(thr)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Steve:不幸的是,`pthread_cancel`是库代码*中唯一干净的方式*来中断可能在系统调用上阻塞的线程.另一种方法是安装中断信号处理程序并确保所有代码都准备好处理`EINTR`,但库代码不能假定它有权更改信号处理或对调用者强制执行`EINTR`处理. (14认同)
  • pthread_cancel,btw的问题在于,如果你使用它,那么在被取消的线程中运行的代码必须理解取消点,并确保(a)它足够频繁地击中它以便它实际上被及时取消,(b)当发生这种情况时,它不会泄漏资源.这有点棘手,而如果你使用一条消息,那么在你的代码中,当线程可以退出时,它就很明确了. (4认同)

ale*_*cov 22

这个问题有两种方法.

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

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

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


Fre*_*son 6

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