使用fork()运行多个任务

时间:2017-09-20 13:21:47

标签: c fork

试图并行运行'任务',但(很明显)我失败了。

我想要它做什么:将大小分成8个不同(相同大小)的任务,同时将它们分成“doSomething”。

#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h> //pid_t
void doSomething(const int start, const int end){
    printf("%d. Doing %d to %d \n", getpid(), start, end);
}

int main(){

    int word_size = 10000;

    for(int i=0; i<3; i++){
        pid_t pid;
        pid = fork();
        if(pid == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
        }
        else {
            doSomething((i+1)*(word_size/8), (i+2)*(word_size/8));
        }
    }
    return 0;
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

你并没有真正将它分成8个部分。您只需启动4个并行进程并在主线程中按顺序执行其他4个部分。此外,您在完成后立即退出主线程,让您的并行流程在闲暇时完成。所以,实际上你需要以下内容:

    pid_t pid[8];
    for (int i = 0; i < 8; i++) {
        pid[i] = fork();
        if(pid[i] == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
            return 0;  // or exit(0);
        }
   }

请注意,在分叉之后,子进程不应该返回循环。我在此时添加了return 0;语句从main返回。或者,如果这不是主路由,则yuo可以使用exit(0);。我认为最合乎逻辑的是在exit(0);函数中使用doSomething

现在你已经开始了所有进程的所有进度。你需要在主线程中等待,直到所有这些完成(除非你真的想让它们自己运行。如下所示:

for (int i = 0; i < 8; i++) {
     int status;
     waitpid(pid[i], &status, WNOHANG);
}

答案 1 :(得分:0)

根据你的逻辑,即使你有8个重复的进程在运行,你也只能覆盖5000个单词(根据你的1000个单词)。

我想你需要逻辑方面的帮助。你的for循环的一点调整就可以解决这个问题:

#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h> //pid_t
void doSomething(const int start, const int end){
    printf("%d. Doing %d to %d \n", getpid(), start, end);
}

int main(){

    int word_size = 10000;

    for(int i=0; i<=6; i=i+2){        //the tweaks
        pid_t pid;
        pid = fork();
        if(pid == 0){
            doSomething((i)*(word_size/8), (i+1)*(word_size/8));
        }
        else {
            doSomething((i+1)*(word_size/8), (i+2)*(word_size/8));
        }
    }
    return 0;
}

希望这有帮助