我如何获得由pthread运行的函数的返回值?

问题描述 投票:0回答:1

我的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语言的新手,所以我对使用指针并不真正充满信心,在这种情况下,这似乎是必要的。

非常感谢:)

c multithreading join return pthreads
1个回答
0
投票

[线程函数应该返回一个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; }


注意,像这样返回一个非指针值(以及将一个非指针值作为参数传递给线程函数)几乎是大多数人都同意这种转换是唯一可行的情况。否则,通常不会。
© www.soinside.com 2019 - 2024. All rights reserved.