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