我正在尝试对产品两个向量进行点缀,每个过程都采用单独的起始和结束索引。似乎正在发生的是代码被执行两次。
void DotProduct::MultiProcessDot()
{
pid_t pID,w;
int status;
unsigned int index = mNumberOfValuesPerVector / 2;
if((pID = fork()) < 0){
cout << "fork error" << endl;
}
else if(pID == 0){ /* child */
ProcessDotOperation(0, index);
exit(EXIT_FAILURE);
}
else{ /* parent */
ProcessDotOperation(index, mNumberOfValuesPerVector);
w = waitpid(pID, &status, WNOHANG);
if(w == 0){
cout << "alive" << endl;
}else if(w == -1){
cout << "dead" << endl;
}
}
}
ProcessDotOperation
使用共享内存sem_wait()
和sem_post()
计算点积。似乎正在发生的是:
家长运行ProcessDotOperation
打印“alive”
家长运行ProcessDotOperation
打印“alive”
程序继续执行(继续执行其他功能)
儿童游戏ProcessDotOperation
儿童游戏ProcessDotOperation
注意:我可能对发生的事情有一个基本的误解,所以parent
和child
,我指的是代码中关于我认为正在运行哪个进程的注释。
如何使子进程运行ProcessDotOperation
一次,父进程运行ProcessDotOperation
一次,然后程序继续运行?
感谢任何帮助。
修改
如果我在fork()
之前打印,并将w = waitpid(pID, &status, WNOHANG);
更改为w = waitpid(pID, &status, 0);
,则输出结果如下:
分叉
父
子
分叉
父
子
继续执行......
以下是ProcessDotOperation
的代码:
void DotProduct::ProcessDotOperation(unsigned int startIndex, unsigned int endIndex)
{
for(unsigned int i = startIndex; i < endIndex; i++){
sem_wait(mSem);
mShmProductId += mVectors[0][i] * mVectors[1][i];
cout << startIndex << " " << endIndex << " " << i << endl;
sem_post(mSem);
}
}
答案 0 :(得分:2)
有人第二次调用MultiProcessDot。
答案 1 :(得分:1)
我认为你需要围绕waitpid()
进行循环。如上所述,你等了一次,没有为一个死去的孩子闲逛,如果孩子还没死,就立即回来。这允许父母继续进行其他活动。
我不确定这是对你观察到的内容的完整解释,但是我们看不到你的跟踪代码。用每条消息打印过程的PID。