代码之家  ›  专栏  ›  技术社区  ›  Namit Patel

如何将数组作为返回值传递给线程?

  •  1
  • Namit Patel  · 技术社区  · 6 年前

    我正在开发一个函数,该函数创建一个线程,并将斐波那契序列计算为某个用户输入的值。例如,如果用户输入 5 ,输出将为: 0 1 1 2 3 5

    但是,必须在创建的线程中计算序列,并且必须在线程退出后打印结果。

    我可以创建线程并计算序列,但我需要传递数组 fibSequence[] 使用返回到原始线程 pthread_exit pthread_join 。我很难理解语法,也找不到任何人通过数组的例子。

    目前为止我拥有的: 我创建了一个函数 fib_runner() 由新创建的线程调用。创建斐波那契序列并将其放置到数组中 fibSequence[] 。我需要把这个传递回main函数。我暂时打印出函数中的序列,但它应该打印在main中。

    非常感谢。

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    void* fib_runner(void* arg)
    {
        int *limit_ptr = (int*) arg;
        int limit = *limit_ptr;
        int fibSequence[limit];
    
        int size = sizeof(fibSequence)/sizeof(fibSequence[0]);
        printf("Size: %d\n", size);
    
        fibSequence[0] = 0;
        fibSequence[1] = 1;
    
        for (int i = 2; i <= size; i++)
        {
            fibSequence[i] = fibSequence[i-1] + fibSequence[i-2];
        }
    
        for (int i = 0; i <= size; i++)
        {
            printf("%d ", fibSequence[i]);
        }
        pthread_exit(0);
    }
    
    int main(int argc, char **argv)
    {
        int limit;
        printf("Enter Number: ");
        scanf("%d", &limit);
    
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
    
        pthread_create(&tid, &attr, fib_runner, &limit);
        pthread_join(tid, NULL);
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   dbush    6 年前

    目前,数组是一个局部变量,因此当函数退出时,它将超出范围。您需要为其动态分配内存:

    int *fibSequence = malloc(sizeof(int) * limit);
    

    然后从函数返回此指针:

    return fibSequence;
    

    在您的 main 函数,然后传递指针的地址以接收该值。然后可以打印数组的内容。完成后,一定要 free 信息技术:

    int *fibSequence;
    pthread_join(tid, (void **)&fibSequence);
    
    for (int i = 0; i < limit; i++)
    {
        printf("%d ", fibSequence[i]);
    }
    free(fibSequence);
    

    而且,你不需要 size 在线程函数中,因为它与 limit ,并且您当前计算它的方式无论如何都不会起作用,因为您现在使用的是指针而不是数组。您的循环限制 fib_runner 还有一个经过数组的末尾。退出条件应为 i < size i <= size

        2
  •  0
  •   0.sh    6 年前

    您必须传入值 void * pthread_exit 这是 pthread_exit(( void * ) &fibSequence ,调用该函数后,传入的值将填充第二个参数 pthread_join ,第二个参数将是指向指针的指针 void ** 它将保存传入的值 pthred_exit

        3
  •  0
  •   sg7 Krafty Coder    6 年前

    进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。

    根据定义,线程共享内存,除了堆栈和局部变量之外,它们不拥有任何东西;

    如果你 fibSequence[limit] 全局,则所有线程都可以访问它。

    您还可以声明 fibSequence[极限] 在堆栈中 main 并将指向它的指针传递给线程。

    要传递多个参数,可以方便地将它们封装在一个结构中。 以下解决方案采用:

    struct arg_struct {
        int limit;
        int *ptrFib;
    }args;
    

    计划:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    struct arg_struct {
        int limit;
        int *ptrFib;
    }args;
    
    void* fib_runner(void* arg)
    {
        struct arg_struct *a = (struct arg_struct *) arg;
        int size = a->limit;
        int * fibSequence = a->ptrFib;  
    
        fibSequence[0] = 0;
        fibSequence[1] = 1;
    
        for (int i = 2; i <= size; i++){
            fibSequence[i] = fibSequence[i-1] + fibSequence[i-2];
        }    
        pthread_exit(0);
    }
    
    int main(int argc, char **argv)
    {
        int limit;
        printf("Enter Number: ");
        scanf("%d", &limit);
        int fibSequence[limit];
    
        struct arg_struct argF;
        argF.limit = limit;
        argF.ptrFib = fibSequence;
    
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
    
        pthread_create(&tid, &attr, fib_runner, &argF);
        pthread_join(tid, NULL);
    
        for (int i = 0; i <= limit; i++){
            printf("%d ", fibSequence[i]);
        }
    }
    

    输出:

    Enter Number: 5                                                                                                                                                                                                                                                               
    0 1 1 2 3 5 
    

    具有全局变量的解 argF 当然有可能,但它不那么优雅。

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    struct arg_struct {
        int limit;
        int *ptrFib;
    }args;
    
    struct arg_struct argF;
    
    void* fib_runner()
    {
        int size = argF.limit;
        int * fibSequence = argF.ptrFib;
    
        fibSequence[0] = 0;
        fibSequence[1] = 1;
    
        for (int i = 2; i <= size; i++){
            fibSequence[i] = fibSequence[i-1] + fibSequence[i-2];
        }
        pthread_exit(0);
    }
    
    int main(int argc, char **argv)
    {
        int limit;
        printf("Enter Number: ");
        scanf("%d", &limit);
        int fibSequence[limit];
    
        argF.limit = limit;
        argF.ptrFib = fibSequence;
    
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
    
        pthread_create(&tid, &attr, fib_runner, NULL);
        pthread_join(tid, NULL);
    
        for (int i = 0; i <= limit; i++){
            printf("%d ", fibSequence[i]);
        }
    }