我使用pthread_create创建多个子线程。一次,主线程想要杀死所有子线程或者会有段falut。我应该用哪种功能来完成它?我从谷歌搜索了答案,得到了像pthread_kill这样的功能。但是我不知道应该向子线程发送哪个信号来杀死它们。我的运行环境是RHEL 5.4,编程语言是C。
答案 0 :(得分:25)
一般来说,你真的不想暴力杀死一个子线程,而是你要求它终止。通过这种方式,您可以确保孩子在安全的地方戒烟并清理其所有资源。
我通常通过父母和孩子之间的一小部分共享状态来做这件事,以允许父母向每个孩子传达“戒烟请求”。这可以是每个子节点的布尔值,由互斥锁保护。子节点定期检查此值(每次循环迭代,或者您的子线程中的任何方便检查点)。看到“quit_request”为真后,子线程会清理并调用pthread_exit
。
在父方面,“kill_child”例程看起来像这样:
acquire shared mutex
set quit_request to true
pthread_join the child
pthread_join可能需要一些时间,具体取决于子项检查其退出请求的频率。确保您的设计可以处理任何延迟。
答案 1 :(得分:21)
可以使用pthread_cancel
“取消”线程。然而,这通常不是最好的做法,尽管在像SEGFAULT这样的极端情况下,可能会采用合理的方法。
答案 2 :(得分:7)
您应该使用
将SIG_TERM发送到每个线程 int pthread_kill(pthread_t thread, int sig);
摆脱所有线程(除了主要线索)的快速方法是fork()并继续与孩子一起。
不是超级清洁...
if (fork()) exit(0); // deals also with -1...
答案 3 :(得分:3)
您可以为整个程序使用全局变量。
int _fCloseThreads;
当您希望线程退出执行时将其设置为1。让线程在其“循环”中检查该变量,并在设置为1时很好地退出。无需使用互斥锁保护它。
您需要等待线程退出。您可以使用加入。另一种方法是在线程进入其线程proc时递增计数器,然后在计数器退出时取消计数器。柜台需要是全球性的。在柜台上使用gcc原子操作。设置fCloseThreads后,主线程可以通过循环,休眠和检查计数等待计数器变为零。
最后,您可以结帐pthread_cleanup_push并弹出。它们是允许线程在其代码中的任何地方取消(使用longjump)然后在退出threadproc之前调用最终清理函数的模型。您基本上将cleanup_push放在threadproc的顶部,并将cleanup_pop放在底部,创建一个展开函数,然后在某些取消点,通过调用pthread_cancel()取消的线程将跳转回threadproc并调用展开函数。