gpt4 book ai didi

c - C 中多线程(pthreads)对数组元素求和

转载 作者:行者123 更新时间:2023-11-30 16:54:46 25 4
gpt4 key购买 nike

我正在尝试实现一种多线程方法来对数组中的元素求和。我的问题非常基本,我想对 2 个数组的元素求和,并将结果放入第三个数组中,即 sumArray[x] = array1[x] + array2[x]。我必须使用 pthreads,我不能使用 OpenMP 或任何类似的隐式多线程库。我已经提出了一个实现,但它不会对数组元素求和(我通过打印结果数组来测试它,该数组不包含两个数组的总和)。如果有人能帮助我指出我在实现中出错的地方,我将非常感激!注意,我还应该将线程数作为命令行参数。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define SIZE 362880
#define NUM_THREADS 5
typedef struct coord {
int nbThreads;
int array1[SIZE];
int array2[SIZE];
int array3[SIZE];
} Item;

void * sumArrays(void *index) {
int i, s, itemsToHandle, start, stop;

itemsToHandle = SIZE / ((Item *) index)->nbThreads;

s = * (int *) index;

start = s * itemsToHandle;

if(s != (((Item *) index)->nbThreads - 1)) start = start + itemsToHandle;
else stop = ((Item *) index)->nbThreads;


for(i = start + 1; i < stop; i++) {
((Item *) index)->array3[i] = ((Item *) index)->array1[i] + ((Item *) index)->array2[i];
}
return(NULL);
}
int main(int argc, char* argv[]) {
int threads = atoi(argv[1]);
Item * arrays = (Item *)malloc(sizeof(Item));
arrays->nbThreads = threads;
for(int i = 0; i < SIZE; i++) {
arrays->array1[i] = 1;
arrays->array2[i] = 1;
}


pthread_t ids[threads];
int i;
for(i = 0; i < threads; i++) {
pthread_create(&ids[i], NULL,sumArrays,&arrays);
void *status;
pthread_join(ids[i], &status);
}
// I also tried to do another for loop for pthread join

for(int i = 0; i < 10; i++) {
printf("Array1 = %d\n", arrays->array1[i]);
printf("Array2 = %d\n", arrays->array2[i]);
printf("Array3 = %d\n", arrays->array3[i]);
}
}

最佳答案

您能检查一下 void * sumArrays(void *index) 中的以下行吗?功能?

s = * (int *) index;

所有线程的值都相同。

线程创建时

pthread_create(&ids[i], NULL,sumArrays,&arrays);

无需应用&运算符:arrays已经是一个指针。

pthread_create(&ids[i], NULL,sumArrays, arrays);

由于 start 的值和stop对于您的所有线程都是相同的,您的算法将无法按预期工作。如果我理解正确的话,你想在线程之间共享一份工作(添加)。第一个线程必须从索引 0 开始添加。看来情况并非如此: for(i = start + 1; i < stop; i++) {我希望以上评论对您有所帮助。

另请检查此链接:Using pthreads to process sections of an array/vector .

关于c - C 中多线程(pthreads)对数组元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40449146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com