我使用pthread_create创建了多个子线程。此时,主线程希望杀死所有子线程,否则会出现段错误。我应该使用哪个函数来完成这个任务?我在谷歌上搜索到了像pthread_kill这样的函数,但我不知道应该发送哪个信号给子线程来杀死它们。我的运行环境是RHEL 5.4,编程语言是C。
我使用pthread_create创建了多个子线程。此时,主线程希望杀死所有子线程,否则会出现段错误。我应该使用哪个函数来完成这个任务?我在谷歌上搜索到了像pthread_kill这样的函数,但我不知道应该发送哪个信号给子线程来杀死它们。我的运行环境是RHEL 5.4,编程语言是C。
通常情况下,您不想暴力终止一个子线程,而是要求它终止。这样,您可以确保子进程在安全位置退出,并清理其所有资源。
我通常使用父子进程之间的共享状态来允许父进程向每个子进程发送“退出请求”。这可以是每个子进程的布尔值,由互斥量保护。子进程定期检查此值(每个循环迭代,或在您的子线程中方便的检查点)。一旦看到“quit_request”为真,子线程将进行清理并调用pthread_exit
。
在父进程方面,“kill_child”例程类似于以下内容:
acquire shared mutex
set quit_request to true
pthread_join the child
根据子线程检查其退出请求的频率,pthread_join可能需要一些时间。确保您的设计可以处理可能出现的任何延迟。
pthread_join
之前终止,会发生什么?线程不需要在加入时保证处于活动状态吗? - Benjamin Crawford Ctrl-Alt-Tut使用 pthread_cancel
可以“取消”线程。但是,通常情况下这不是最佳实践,只有在极端情况下,比如SEGFAULT时,才可能考虑采用这种方法。
pthread_cancel
为什么不被认为是最佳实践?如果不是最佳实践,那么什么是最佳实践? - darnir int pthread_kill(pthread_t thread, int sig);
除了主线程之外,一个快速摆脱所有线程的方法是使用fork()并继续进行子进程。
不是特别干净的解决方案...
if (fork()) exit(0); // deals also with -1...
main
超出范围时仍需要这些对象,为什么它们被分配在main
的堆栈上? - David Schwartz