【问题标题】:How to Kill child threads from Parent thread - C如何从父线程中杀死子线程 - C
【发布时间】: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


【解决方案1】:

scoped_lock

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

话虽如此,我不建议在生产就绪代码中终止线程,除非确实有必要并且没有其他选择可以使用,您还可以使用信号机制来通知线程自行终止,从而避免很多问题。例如,您可以在线程内为特定信号设置一个等待函数,并在收到该信号后立即退出该线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2017-01-10
    • 2011-06-29
    • 2010-12-19
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多