C 使用fork()运行多个任务
试图并行运行“任务”,但(显然)我失败得很惨 我想让它做的是:将大小分成8个不同(相同大小)的任务,同时对它们进行“doSomething”C 使用fork()运行多个任务,c,fork,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", getp
#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;
}
#包括
#包括
#包括//pid\t
无效剂量测量(常数开始,常数结束){
printf(“%d.执行%d到%d\n”,getpid(),开始,结束);
}
int main(){
int word_size=10000;
对于(int i=0;i,根据您的逻辑,您将只能覆盖5000个单词(根据您的字号1000),即使您将运行8个重复进程
我想你需要逻辑方面的帮助。稍微调整一下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;
}
#包括
#包括
#包括//pid\t
无效剂量测量(常数开始,常数结束){
printf(“%d.执行%d到%d\n”,getpid(),开始,结束);
}
int main(){
int word_size=10000;
对于(int i=0;i您并不是真的将其拆分为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);
}
}
for (int i = 0; i < 8; i++) {
int status;
waitpid(pid[i], &status, WNOHANG);
}
您确定要单独的进程而不是线程吗?@ChrisTurner,是的,试图避免pthread您的父进程不应该执行该函数;只有子进程应该执行该函数。请不要忘记在退出之前等待子进程死亡。@空格为什么要避免pthread?如果fork
返回-1,可能需要执行一些操作,例如break ou循环的t?或者至少,不要为任何失败的子项调用waitpid
。@Serge,谢谢你的评论。但是,这似乎也不起作用。基本上,我得到了很多进程,重复同样的工作。结果:你需要确保你的doSomething
不返回,而是退出。或者你可以直接执行在循环中。我将编辑答案。就像在调用doSomething后添加退出(0)一样?要试试吗!