C 需要帮助我弄清楚我需要更改什么以实现所需的更改吗
我尝试了一些方法,但无法使其工作,规格是下一步,谢谢 使用fork和waitpid函数,实现此程序的新版本,其中由remover_ruido执行的处理分为16个进程 我的第一个方法是:C 需要帮助我弄清楚我需要更改什么以实现所需的更改吗,c,fork,waitpid,C,Fork,Waitpid,我尝试了一些方法,但无法使其工作,规格是下一步,谢谢 使用fork和waitpid函数,实现此程序的新版本,其中由remover_ruido执行的处理分为16个进程 我的第一个方法是: const int NPROCESSES = 16; pid_t pids[128]; for (int i = 0; i < NPROCESSES;i ++) { pids[i] = fork(); if (!pids[i]) { remover_
const int NPROCESSES = 16;
pid_t pids[128];
for (int i = 0; i < NPROCESSES;i ++) {
pids[i] = fork();
if (!pids[i]) {
remover_ruido(amostras_out, amostras_in, n_amost);
exit(0);
}
}
for (int i = 0; i < NPROCESSES; i++)
waitpid(pids[i], 0, 0);
const int n进程=16;
pid_t pid[128];
for(int i=0;i
我做了一个smilar项目,但使用了线程,要求将进程分成50个线程。我不知道我是否能用同样的方法
#包括
#包括
#包括
#包括
#包括
#包括
#定义NMIN 4000
双mytime();
void*malloc_pshared(大小);//阿罗卡·梅莫里亚·帕蒂尔哈达·恩特·普罗索(aloca memória partilhada entre processos)
空隙清除器(短*护墙板向外,短*护墙板向内,向内);
int main(int argc,char*argv[])
{
国际货币基金组织;
如果(argc!=2 | |(n|amost=atoi(argv[1]))
这里有一个轻微的重构,可以在每个进程的基础上分割数据。我编写了代码,但没有编译或测试它:
const int NPROCESSES = 16;
pid_t pids[128];
int chunksize = n_amost / NPROCESSES; // number of elements per process
int remain = n_amost; // number of elements remaining
int curoff; // current offset into arrays
int cursize; // current length for process
for (int i = 0; i < NPROCESSES; i++, remain -= cursize) {
pids[i] = fork();
if (! pids[i]) {
// get index into arrays for this process
curoff = i * chunksize;
// assume we're a middle process -- use the calculated length
cursize = chunksize;
// last process must get the remainder of the array
if (i >= (NPROCESSES - 1))
cursize = remain;
remover_ruido(&amostras_out[curoff], &amostras_in[curoff], cursize);
exit(0);
}
}
for (int i = 0; i < NPROCESSES; i++)
waitpid(pids[i], 0, 0);
const int n进程=16;
pid_t pid[128];
int chunksize=n_amost/n进程;//每个进程的元素数
int remain=n_amost;//剩余元素数
int curoff;//阵列中的当前偏移量
int cursize;//进程的当前长度
for(int i=0;i=(n进程-1))
草书=保留;
移除器_ruido(&amostras_out[curoff]、&amostras_in[curoff],光标);
出口(0);
}
}
for(int i=0;i
请注意,还有其他方法可以分割偏移/长度,但这应该可以让您开始
请注意,您应该仔细检查您的
mmap
调用,以确保它符合您的要求。此变量与Craig Estey的非常相似,不同之处在于它实际上可以工作,因为它不会在假设将在父级中修改的情况下修改子级中的变量。;-)
只有你的第一条进近路线
需要改成
int from = n_amost*i/NPROCESSES,
to = n_amost*(i+1)/NPROCESSES;
remover_ruido(amostras_out+from, amostras_in+from, to-from);
我尝试了一些方法,但无法使其工作。请编辑您的问题,并在附加代码块中发布此代码。你到底尝试了什么,结果是什么。描述一下你所采用的一般方法。我做了一些类似的事情,但是使用了线程,他们让我将进程分成50个线程。我这里的问题是,我尝试了相同的方法,但每次都会出现错误,where's
malloc_pshared
?我编辑了它,但我将它放回@armali如果我需要检查每个进程是否都在运行,我需要添加什么代码从哪个进程检查每个进程是否都在运行?无论您选择哪一个,都必须防止每个正在运行的进程在检查之前完成。这张支票有什么意义?您已经检查了每个进程是否都使用waitpid
循环运行。好的,非常感谢您的帮助我忘记了一件事:要查看进程是否无法启动,我们应该添加e。g<代码>如果(pids[i]=-1)perror(“fork”)代码>在fork()
行之后。
remover_ruido(amostras_out, amostras_in, n_amost);
int from = n_amost*i/NPROCESSES,
to = n_amost*(i+1)/NPROCESSES;
remover_ruido(amostras_out+from, amostras_in+from, to-from);