如何使用 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() 将数字与父进程和子进程相加 [重复]

如何使用 Fork() 只创建 2 个子进程?

如何重定向 fork() 创建的子进程的 IO 并使用 exec() 函数?

如何将参数传递给由 fork() 创建的进程

Git 如何合并 Fork 的仓库的最新代码

fork() 和 wait() 有两个子进程