并行合并排序(使用fork)

时间:2016-01-29 17:20:10

标签: c fork mergesort

该函数对位于区间[s,e](v [s],v [s + 1],...,v [e]将被排序)的数组v的元素进行排序。 对于数组3 2,它会2 3 但对于具有2个以上元素的数组(如3 2 4),它会使数组不变。

void merge(int v[],int s, int e)
{
    if(e==s)    return; //if there is just one number
    int m=(s+e)/2;
    pid_t f1,f2;
    if((f1=fork())==0){merge(v,s,m);exit(0);} //sort the numbers from position s to position m
    if((f2=fork())==0){merge(v,m+1,e);exit(0);} //same for numbers from position m+1 to e
    waitpid(f1,NULL,0); //wait until the first half is sorted
    waitpid(f2,NULL,0); //same for the second half
    int *t=(int*)malloc((e-s+1)*sizeof(int)); //temporary array for merging the 2 halves
    int k=0,i=s,j=m+1;
    while((i<=m)&&(j<=e)) //while there are stil unprocessed numbers left in each half
        if(v[i]<v[j])   t[k++]=v[i++];
        else            t[k++]=v[j++];
    while(i<=m)         t[k++]=v[i++]; //copy the remaining numbers
    while(j<=e)         t[k++]=v[j++];
    while(k)            v[e--]=t[--k]; //copy them back in the original array
    free(t); //delete the temporary array
}

2 个答案:

答案 0 :(得分:1)

在您分叉后,您的两个进程没有共享相同的数据,它们从相同的副本开始,但是它们自己进行了更改,父进程没有看到它们的更改

如果你想要平行,你必须

  • 将数组放入共享内存
  • 使用线程(它们共享公共内存)
  • 使用IPC机制将已排序的数据流回合并

答案 1 :(得分:0)

如果您没有专门附加到合并排序,那么这里是forking quick sort,它总是在第一个元素上转动。此外,它使用popen / pclose而不是显式的fork / waitpid。