让一个多线程(pthreads)C程序有一个(可连接/附加)线程树,如下所示:
main
└── th0
├── th1
│ ├── th3
│ └── th4
│ ├── th5
│ └── th6
└── th2
├── th7
│ └── th9
└── th8
任何主题' thX
'最多可以有2个子线程。
树是动态的:剪切分支,并连续创建新线程。
当条件满足时,我想杀死一个线程,而不是线程的一个分支。也就是说,如果我要杀死th2
,我也希望所有这些都被杀死:th7
,th8
& th9
。
最好(最有效/最可读)的方法是什么?
跟踪树的最佳(最有效/最可读)方法是什么?
现在我使用_Thread_local
变量来保留一个线程的名称(X
),另一个保留其父级的名称,以及一个长度为2的数组孩子的名字,但这只能让我杀死一个孩子,而不是孙子等等。
我不知道它是否相关,但我使用的是GNU / Linux和GCC6
PS:我确实想强迫杀死线程。我不喜欢malloc,所以泄漏不是问题。PS.2:它是Branch& amp;的一部分。绑定算法;这是约束的部分。
答案 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);
}