gpt4 book ai didi

C - 杀死线程分支

转载 作者:行者123 更新时间:2023-11-30 14:54:27 25 4
gpt4 key购买 nike

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

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

任何线程“thX”最多可以有 2 个子线程。

树是动态的: Twig 被切断,新的线程不断创建。

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

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

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

现在我使用一个 _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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com