C - 杀死线程分支

标签 c multithreading pthreads

让多线程(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/

相关文章:

c - 尝试填充二维矩阵时出现段错误(核心转储)错误

c# - 这个 thread.abort() 正常安全吗?

c - 从 pthread_create 将多个参数传递给线程函数

c - 当后台缓冲区像素格式设置为 DXGI_FORMAT_B8G8R8X8_UNORM 时,为什么 D3D11CreateDeviceAndSwapChain 会失败?

c++ - 如何在C中写入特定地址的数据

c - 二分查找代码行

java - 在多个线程中调用相同的API

c# - 使用事件和 BackgroundWorker 更新导致竞争条件的 UI

c - 生成任意数量的线程

linux - 内核级线程库