【发布时间】:2016-11-06 12:06:39
【问题描述】:
我正在尝试实现一种多线程方法来对数组中的元素求和。我的问题很基本,我想对 2 个数组的元素求和,并将结果放入第三个数组,即 sumArray[x] = array1[x] + array2[x]。我必须使用 pthread,我不能使用 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]);
}
}
【问题讨论】:
标签: c arrays multithreading pthreads