Pthreads不能同步执行其功能

时间:2015-09-27 03:55:28

标签: c parallel-processing pthreads mutex synchronous

所以我试图为我的并行类完成一个赋值,它涉及使用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();的情况下重写此代码相同的结果?

提前致谢!

0 个答案:

没有答案