我的C程序有问题,我认为我需要一些帮助。我的程序正在使用多个线程进行一些计算。每个线程运行一个仅带有一个参数的方法,最后返回一个整数。
现在,要完成我的计算,必须取所有子计算的总和,这意味着线程返回的所有整数的总和。
但是以某种方式,该结果不正确。我想从线程获取所有返回的整数时犯了一个错误。这是我的代码:
//creating the threads (with splitArray[] as an array of pointers to other arrays)
pthread_t threads[n];
for (int i = 0; i < n; i++) {
pthread_create(&threads[i], NULL, (void * )(countPrime), (void * )splitArray[i]);
}
//getting the results of the threads
int numPrimes = 0;
int save;
for (int i = 0; i < n; i++) {
pthread_join(threads[i],(void **) &save);
numPrimes = numPrimes + save;
}
这是每个线程都使用的方法:
int countPrime(int array[]) {
int numPrimes = 0;
for (int i = 0; i < size; i++) {
//checking if array[i] is a prime number
if (isPrime(array[i])) {
numPrimes++;
}
}
return numPrimes;
}
我犯错了吗?我是C语言的新手,所以我对使用指针并不真正充满信心,在这种情况下,这似乎是必要的。
非常感谢:)
[线程函数应该返回一个void *
指针,并且在64位计算机上,void *
通常为64位宽,而int
通常仅为32位宽。
当您从预期将返回64位值的函数返回32位值时,多余的32位将具有什么值?这是未知的,因此您的代码显示为undefined behavior。
要解决您的问题(我认为可能是这样),您需要更新线程函数以返回正确的类型(void *
),并执行一些[[casting以确保您返回的值正确类型和大小:
void *countPrime(int array[]) {
...
return (void *) (intptr_t) numPrimes;
}
然后,当您获取值时,还需要使用正确的类型,并使用相反的强制转换:
void *result; for (int i = 0; i < n; i++) { pthread_join(threads[i],&result); numPrimes = numPrimes + (int) (intptr_t) result; }
注意,像这样返回一个非指针值(以及将一个非指针值作为参数传递给线程函数)几乎是大多数人都同意这种转换是唯一可行的情况。否则,通常不会。