从线程传递数组

时间:2018-07-11 19:36:02

标签: c arrays multithreading primes

对于学校,我有一个多线程作业。每个线程应该从控制台输入中获取一个数字,找到其所有质数,然后将所有这些质数作为数组返回。我正在努力以可以显示它的方式返回数组。这是我的一些代码:

    int *number;

    for (int i =1; i < argc; i++) {
        pthread_create(&thread[i], NULL, prime_nums, (void*)argv[i]);
    }
    for (int i =1; i < argc; i++) {
        pthread_join(thread[i],(void**) &number);
        printf("%d\n", *(number + 0)); //This is just to test if the variable is correct
    }

...

void *prime_nums(void*m) {
    int n = atoi(m);
    int count = 0;
    int f = 2;
    int primeNumbers[MAX_PRIME];
    /*printf("%d: ", n);*/
    while (n > 1 && count < MAX_PRIME) {
        if (n % f == 0) {
            primeNumbers[count++] = f;
            n /= f;
        }
        else {
            f += 1;
        }
    }
    /*printf("\n");*/
    int test[2];
    test[0] = 0;
    test[1] = 1;
    test[2] = 2;
    pthread_exit(test);
}

我已经在线程中检查了数组primeNumbers,并且数组中的数据正确,但是我不知道如何将该数组保存到主函数中的另一个数组中。

1 个答案:

答案 0 :(得分:3)

线程函数中的数组test是一个局部变量,当函数返回时(线程退出),该变量超出范围。返回局部变量的地址,然后取消引用该地址将调用undefined behavior

您需要为数组动态分配内存并返回该指针:

void *prime_nums(void*m) {
    ...
    int *test = malloc(sizeof(int) * 3);
    test[0] = 0;
    test[1] = 1;
    test[2] = 2;
    pthread_exit(test);
}

此外,pthread_exit的第二个参数应该是void *的地址:

void *rval;
int *number
pthread_join(thread[i], &rval);
number = rval;