对于学校,我有一个多线程作业。每个线程应该从控制台输入中获取一个数字,找到其所有质数,然后将所有这些质数作为数组返回。我正在努力以可以显示它的方式返回数组。这是我的一些代码:
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
,并且数组中的数据正确,但是我不知道如何将该数组保存到主函数中的另一个数组中。
答案 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;