【发布时间】:2017-11-11 17:02:11
【问题描述】:
我有一个进程很少的小程序,每个进程包含几个线程。
当父进程收到特定消息时,它应该杀死所有子线程并销毁所有互斥锁。问题是其中一些线程可能会被阻塞(在 I/O 命令上),因此无法接收某些信号或 msg 以完成它们的过程。
我考虑过使用pthread_cancel 并覆盖cancel routine,但问题是在发送cancel signal 时某些互斥锁似乎被锁定,因此无法销毁。
使用pthread_kill 没有要么工作,因为它会杀死整个过程,因此在我想要干净退出时无法使用。
进程如何以干净的方式杀死其子线程并销毁互斥锁?
代码的相关部分如下所示:
ret = fork()
if(ret > 0) {
pthread_t th1, th2;
my_pthread_create(&th1, threadFunction1, NULL);
my_pthread_create(&th2, threadFunction2, NULL);
if(msgrcv(qid1, &msg, MSG_SIZE,0,0) < 0) {
perror("msgrcv failed...\n");
} else {
//print some information from the global variables, terminate
//threads and destroy mutexes
}
}
else if(ret<0) {
perror("fork failed...\n");
} else {
....
}
任何帮助将不胜感激!
谢谢
【问题讨论】:
-
虽然 this question 适用于 C++,但我认为它及其接受的答案应该很有用。
-
"进程如何以干净的方式杀死其子线程 [...]" 我会说这在定义上是不可能的,因为取消线程只是“脏”。不要这样做,它可能会导致意想不到的副作用。一种干净的方法是使用由父线程设置并由子线程读取的标志。如果设置了标志,孩子们就会结束自己。如果线程可能在系统调用中被阻塞等待,则向线程发送信号以中断它被卡住的系统调用。
标签: c multithreading pthreads multiprocessing