对于pthread,如何从主线程中杀死子线程

ter*_*ry 19 c linux multithreading pthreads

我使用pthread_create创建了几个子线程.一次,主线程想要杀死所有子线程或者会有段falut.我应该用哪种功能来完成它?我从谷歌搜索了答案,得到了像pthread_kill这样的功能.但是我不知道应该向子线程发送哪个信号来杀死它们.我的运行环境是RHEL 5.4,编程语言是C.

Bil*_*ble 25

一般来说,你真的不想暴力杀死一个子线程,而是你要求它终止.通过这种方式,您可以确保孩子在安全的地方戒烟并清理其所有资源.

我通常用父母和孩子之间的一小部分共享状态来做这件事,以允许父母向每个孩子传达"戒烟请求".这可以是每个子节点的布尔值,由互斥锁保护.子节点定期检查此值(每次循环迭代,或者您的子线程中的任何方便检查点).看到"quit_request"为真,子线程清理并调用pthread_exit.

在父方面,"kill_child"例程看起来像这样:

acquire shared mutex
set quit_request to true 
pthread_join the child 
Run Code Online (Sandbox Code Playgroud)

pthread_join可能需要一些时间,具体取决于子项检查其退出请求的频率.确保您的设计可以处理任何延迟.

  • @Brent:[这个问题](http://stackoverflow.com/questions/21183261/is-a-race-condition-possible-when-only-one-thread-writes-to-a-bool-variable-in- c)显示了一个例子,即使编写一次的单个标志也可能在编译器优化后导致竞争条件. (2认同)

tor*_*rak 21

可以使用"取消"线程pthread_cancel.然而,这通常不是最好的做法,尽管在像SEGFAULT这样的极端情况下它可能是一种合理的方法.

  • 为什么`pthread_cancel`不被认为是最佳做法?如果不是最佳实践,那是什么? (5认同)

Rin*_*g Ø 7

您应该使用发送SIG_TERM到每个线程

  int pthread_kill(pthread_t thread, int sig);
Run Code Online (Sandbox Code Playgroud)

摆脱所有线程(除了主要)之外的一种快速方法是fork()并继续使用子进程.
不是超级干净......

  if (fork()) exit(0); // deals also with -1...
Run Code Online (Sandbox Code Playgroud)