一、問題描述
將數組A均勻劃分紅m個片斷,每一個數組片斷最多有(n+m-1)/m 個元素。每一個數組片斷分別由一個線程負責局部求和,最後這些部分和加起來就獲得數組中全部元素的總和。數組
二、相關代碼
此代碼在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;
}函數
三、技術難點
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。線程
本文歡迎轉載,轉載請註明做者與出處指針
做者:流星blog