试图并行运行'任务',但(很明显)我失败了。
我想要它做什么:将大小分成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;
}
任何帮助都将不胜感激。
答案 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;
}
希望这有帮助