如何使用 fork 进程实现合并排序?
Posted
技术标签:
【中文标题】如何使用 fork 进程实现合并排序?【英文标题】:How can I implement a merge sort by using fork processes? 【发布时间】:2017-05-21 08:33:59 【问题描述】:使用 fork 进程,我想实现归并排序。我想划分和征服数组中数据的排序:我想通过将每一半分配给一个子进程来划分,然后通过使父进程合并这些部分来进行征服。
以下代码仅适用于两个数字,对于三个或更多数字,数组不会改变。为什么?
void sort(int low, int high, int a[100], int b[100])
int mid;
pid_t pid1, pid2;
if(low < high)
mid = (low + high) / 2;
pid1=fork();
if (pid1<0) exit(0);
if (pid1==0) //first child process
sort(low, mid,a,b); //first half
exit(0);
else wait(NULL);
pid2=fork();
if (pid2<0) exit(0);
if (pid2==0) //second child process
sort(mid+1, high,a,b); //second half
exit(0);
else wait(NULL);
if (pid1>0 && pid2>0)
merging(low, mid, high,a, b);
【问题讨论】:
你确实意识到任何两个进程都不能改变另一个进程的内存。 Read on fork, please。分叉的进程有自己的内存空间,与父进程分开。对子数组中的子数组的任何更改都在父数组中不可见,反之亦然。您想要的是用户空间线程,例如pthreads
库创建的。
@StoryTeller pthreads 通常不是用户空间。您通常不关心您的线程库是否是用户空间,只要它可以利用多个处理器/内核。
【参考方案1】:
正如已经指出的那样,分叉的进程既不能看到也不能改变彼此的内存空间。
你有(至少)三个选项:
使用分叉的进程和管道(例如:Fork parent child communication) 使用分叉进程和共享内存(例如:How to share memory between process fork()?) 使用线程(例如:C threads and joining)【讨论】:
以上是关于如何使用 fork 进程实现合并排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 fork() 将数字与父进程和子进程相加 [重复]