让多线程(pthreads)C 程序具有如下所示的(可连接/附加)线程树:
main
└── th0
├── th1
│ ├── th3
│ └── th4
│ ├── th5
│ └── th6
└── th2
├── th7
│ └── th9
└── th8
任何线程“thX
”最多可以有 2 个子线程。
树是动态的: Twig 被切断,新的线程不断创建。
当满足条件时,我想杀死的不是一个线程,而是一个线程分支。也就是说,如果我想杀死 th2
,我也希望所有这些都被杀死:th7
、th8
和 th9
.
最好的(最有效/最易读的)方法是什么?
跟踪树的最佳(最有效/最可读)方法是什么?
现在我使用一个 _Thread_local
变量来保存线程的名称 (X
),另一个变量来保存其父级的名称,以及一个数组长度为 2 来保留 child 的名字,但这只允许我杀死一个 child ,而不是孙子等等。
我不知道这是否相关,但我正在使用 GNU/Linux 和 GCC6
PS:我确实想强制终止线程。我不进行 malloc,所以泄漏不是问题。
PS.2:它是分支限界算法的一部分;这是绑定(bind)的部分。
最佳答案
看看这是否适合您。每个“父”线程都可以推送清理例程,这将取消它们的子线程。当你想取消子树时,你可以在父树上执行 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);
}
关于C - 杀死线程分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46728821/