我有一个进程很少的小程序,每个进程都包含几个线程。
当父进程收到特定消息时,它应该杀死其所有子线程并销毁所有互斥锁。问题是其中一些线程可以被阻止(在 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 {
....
}
任何帮助将不胜感激!
谢谢
scoped_lock
是您可以使用的最佳选择之一,当程序执行超出范围时,这将自动释放互斥锁。
话虽如此,我不建议在生产就绪代码中杀死线程,除非确实有必要并且没有其他选择,您还可以使用信号机制通知线程自行死亡,这将避免很多问题。例如,您可以在线程中为特定信号设置一个等待函数,并在收到相同信号后立即退出线程。