如何从父线程中杀死子线程 - C

时间:2017-06-09 15:41:32

标签: c multithreading pthreads multiprocessing

我很抱歉,如果这是一个微不足道的问题,但我无法在网上找到解决方案。我有一个只有很少进程的小程序,每个进程包含几个线程。

当父进程收到特定消息时,它应该杀死所有子线程并销毁所有互斥锁。问题是某些线程可能被阻塞(在I / O命令上),因此无法接收某些信号或消息以完成其过程。

我考虑使用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
    ....

任何帮助都将非常感谢!
谢谢

1 个答案:

答案 0 :(得分:2)

  

的scoped_lock

是您可以使用的最佳选项之一,当程序执行超出范围时,它会自动释放互斥锁。

有了这个说我不建议杀死生产就绪代码中的线程,除非它确实是必要的并且没有其它选项可以使用,你也可以使用信号机制来通知线程自己死掉会避免很多问题。比如说你可以在线程中为特定信号设置一个等待函数,并在收到线程后立即退出线程。