gpt4 book ai didi

c - 重复使用相同的线程

转载 作者:行者123 更新时间:2023-12-04 19:58:03 30 4
gpt4 key购买 nike

我正在编写一个赋值程序,它使用线程在两个给定数组之间实现矩阵乘法。

我必须给出我想用作命令行参数的线程数,如果它们的数量小于第一个数组的行数,则重用一些相同的线程,直到整个工作完成。

我设法让它工作,但只为数组的每一行使用一个线程。
例如,如果有一个 5x5 乘法并且使用少于 5 个线程,我就会出现段错误,这是有道理的。

我的问题是:在该线程完成其工作后,我如何重用该线程?
在前面的例子中,我的意思是如果我想为 5x5 使用 2 个线程,我的程序应该像这样工作:

线程 1-> 行 1

线程 2-> 行 2

线程 2-> 行 3

线程 1-> 行 4

等等。

最佳答案

您有多种可能性,但主要思想是您必须监视线程以检测它们何时完成其工作,并有办法知道是否还有事情要做。

想到的第一种方法是有一个专用线程来跟踪所有正在运行的线程,并在它们完成后回收它们。但是为了做到这一点,您需要一种让线程同步的机制,该机制可以使用信号量或互斥锁或消息来实现,但如果您已经不需要它,那么为此目的编写代码可能会很麻烦.

第二种方法就是让他们自己回收,因为他们知道什么时候完成。在许多其他语言中,有一种称为延续的机制,它可以让您做到这一点,但由于我们正在处理 C,因此我们需要手动完成。幸运的是,这里的延续实际上只是一项任务。

所以调用continuation的机制其实只是一个函数,它会先运行线程要执行的任务,然后:

  • 检查任务列表。此任务列表必须在设置时填写任务需要完成的所有工作,
  • 将该线程添加到可用线程队列中,该队列必须由其他线程再次检查并重新分配新任务,

  • 显然,第一个选项会更容易,而且在您的情况下,您在设置时已经知道必须完成什么,因此您的设置功能可以填写任务列表,然后根据需要启动任意数量的线程,并让它们自己做回收。

    这是一个简单的骨架,您可以从它开始:
     typedef struct {
    /* task related data */
    } task_t;

    // basic list structure
    typedef struct {
    list_t *next;
    void *data; // here app specific data
    } list_t;

    list_t task_list; // your task list

    // a few operators to manipulate a list
    // implementation must use a mutex to avoid race conditions
    void list_push(list *l, void *data);
    void *list_pop(list *l);


    // thread function

    void do_task(task_t *task){
    while (task) {
    run_task(task); // that would be the matrix related function
    task = list_pop(&task_list);
    }

    // here a simple define for the number of threads
    // you might want to check the number of available cores instead

    #define MAX_THREAD_COUNT 4

    int main() {

    pthread_t threads[MAX_THREAD_COUNT];

    setup_task_list(); // push all the work that must be done in the list
    int i;
    for (i = 0; i < MAX_THREAD_COUNT; i++) {
    pthread_create(threads + i, NULL, do_task, list_pop(&task_list));
    }

    // here wait for all the threads, or detach them

    }

    这是您可以做什么的基本概述,应该可以帮助您入门。
    关于 SO 处理 C 链表有几个问题。这里的必须同步,不能阻塞,返回 NULL空的时候。

    关于c - 重复使用相同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372721/

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