C - 杀死线程分支

时间:2017-10-13 11:25:16

标签: c multithreading pthreads

让一个多线程(pthreads)C程序有一个(可连接/附加)线程树,如下所示:

main
└── th0
    ├── th1
    │   ├── th3
    │   └── th4
    │       ├── th5
    │       └── th6
    └── th2
        ├── th7
        │   └── th9
        └── th8

任何主题' thX'最多可以有2个子线程。

树是动态的:剪切分支,并连续创建新线程。

当条件满足时,我想杀死一个线程,而不是线程的一个分支。也就是说,如果我要杀死th2,我也希望所有这些都被杀死:th7th8& th9

最好(最有效/最可读)的方法是什么?

跟踪树的最佳(最有效/最可读)方法是什么?

现在我使用_Thread_local变量来保留一个线程的名称(X),另一个保留其父级的名称,以及一个长度为2的数组孩子的名字,但这只能让我杀死一个孩子,而不是孙子等等。

我不知道它是否相关,但我使用的是GNU / Linux和GCC6

PS:我确实想强迫杀死线程。我不喜欢malloc,所以泄漏不是问题。

PS.2:它是Branch& amp;的一部分。绑定算法;这是约束的部分。

1 个答案:

答案 0 :(得分:1)

看看这是否适合您。每个父母"线程可以推送清除例程,这将取消他们的孩子。如果要取消子树,可以在父....上执行pthread_cancel()。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>


void cancel_child(void *ptr)
{
    printf("cancelling child\n");
    pthread_cancel(*((pthread_t *) ptr));
}

void *runner(void *ptr)
{
    pthread_t thr1, thr2;
    long depth;

    depth = (long) ptr;
    if (!(--depth)) return NULL;

    pthread_create(&thr1, NULL, runner, (void *) depth);
    pthread_cleanup_push(cancel_child, (void *) &thr1);

    pthread_create(&thr2, NULL, runner, (void *) depth);
    pthread_cleanup_push(cancel_child, (void *) &thr2);

    if (depth == 2) {
        sleep(1);
        // cancel the subtree
        pthread_cancel(thr1);
        pthread_cancel(thr2);
    }

    sleep(10 - depth);

    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
}


int main()
{
    runner((void *) 3);
}