所以我试图为我的并行类完成一个赋值,它涉及使用Pthreads来总结一些数字。
我有一个sum函数,我传递一个struct:
void *partition(void* p){
ThreadData *a=malloc(sizeof(ThreadData));
a=(ThreadData*)p;
int i = a->pid;
int sum=0;
int size = a->rows*a->cols;
int row=a->pid/a->cols;
int col=a->pid%a->cols;
int partition_size = ((size / processors)+1);
for(i;i<partition_size*processors;i+=processors){
col = i%a->cols;
row = i/a->cols;
if (i<=size-1){
sum+= matrix[row][col]+1;
//printf("[%d][%d]%d +",row,col,matrix[row][col]);
}
}
a->localsum=sum;
printf("function sum: %d\n",sum);
pthread_exit(NULL);
}
在我的主要方法中我有以下
int main(){
int totalsum=0;
void *status;
ThreadData *g;
g=malloc(processors*( sizeof(ThreadData)));
int i;
for(i=0;i<processors;i++){
g[i].rows=rows;
g[i].cols=cols;
g[i].pid=i;
g[i].localsum=0;
}
fillMatrix(rows, cols);
pthread_t tid[processors];
i;
for(i=0;i<processors;i++){
pthread_create(&tid[i],NULL,partition,(void *)&g[i]);
sleep(1);
pthread_mutex_lock(&mVar);
totalsum+=g[i].localsum;
pthread_mutex_unlock(&mVar);
}
for(i=0;i<processors;i++){
pthread_join(tid[i],NULL);
}
printf("The sum of your Matrix is %d",totalsum);
}
对于4x4矩阵上的3个处理器,我得到以下输出
function sum: 51
function sum: 40
function sum: 45
The sum of your Matrix is 136
正如您所看到的,为了产生所需的结果,我使用sleep(1);
但是让程序等待一整秒再继续完全失去了并行计算的多线程的目的。它也使得他使用互斥锁毫无意义,我可以逐字地将它们注释掉,程序的功能也一样。
从我在网络教程中看到的情况来看,这是许多人编写代码的方式,但它似乎并不适合我。
那么如何在不使用sleep();
的情况下重写此代码相同的结果?
提前致谢!