1、问题描述
将数组A均匀划分成m个片段,每个数组片段最多有(n+m-1)/m 个元素。每个数组片段分别由一个线程负责局部求和,最后这些部分和加起来就得到数组中所有元素的总和。2、相关代码
此代码在gcc4.3下编译通过 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 4 int N; int *X; int gSum[NUM_THREADS]; void* Summation(void *pArg){ int tNum= *((int *)pArg); int lSum=0; int start,end; int i; start = (N/NUM_THREADS)*tNum; printf("start is:%d\n",start); end = (N/NUM_THREADS)*(tNum+1); printf("end is:%d\n",end); if(tNum == NUM_THREADS -1) end =N; for(i=start;i<end;i++) lSum+=X[i]; gSum[tNum]=lSum; free(pArg); }void initArr(){
int i; puts("input array length::"); scanf("%d",&N); X=(int*)malloc(N*sizeof(int));// for(i=0;i<N;i++) { X[i]=i+1; printf("%d\t",X[i]); } } int main(void){ int j,sum=0; pthread_t tHandles[NUM_THREADS]; initArr(); for(j=0;j<NUM_THREADS;j++ ){ int *threadNum =malloc(4); *threadNum=j; // printf("threadNum is:%d\n",*threadNum); pthread_create(&tHandles[j],NULL,Summation,(void*)threadNum); } for(j=0;j<NUM_THREADS;j++){ pthread_join(tHandles[j],NULL); sum+= gSum[j]; } printf("the sum of array elements is %d\n",sum); return 0; }3、技术难点
1)动态数组初始化 C语言中不允许动态数组类型。例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明,这是错误的。 这里使用malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型 void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 2)void类型转换 malloc返回类型是 void* 类型 这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void,即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。可以用强转的方法将其转换为别的类型。例如: int *pd=NULL; pi=(int *)malloc(N*sizeof(int)); 向系统申请10个连续的int类型的存储空间,用指针pi指向这个连续的空间的首地址。 并且用(int*)对malloc的返回类型进行转换,以便把int类型数据的地址赋值给指针pi 3)主线程等待子线程结束 对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。这里用的方法是pthread_join pthread_join方法的功能就是等待线程结束 syntax: int pthread_join(pthread_t thread, void **retval); 第一个参数,线程id,就是要等待的线程ID 第二个参数用来接受线程函数的返回值,如果没有返回值,就直接设为NULL。本文欢迎转载,转载请注明作者与出处
作者:流星
出处: