gpt4 book ai didi

c++ - fork 子和父运行单独的代码

转载 作者:行者123 更新时间:2023-11-28 00:58:29 25 4
gpt4 key购买 nike

我正在尝试对两个 vector 进行点积,每个过程都有一个单独的开始和结束索引。似乎正在发生的是代码被执行了两次。

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”

  • 程序继续执行(继续执行其他功能)

  • child 运行 ProcessDotOperation

  • child 运行 ProcessDotOperation

注意:我可能对正在发生的事情有根本性的误解,所以对于 parentchild,我指的是代码中关于我在哪个过程中的注释认为正在运行。

如何让子程序运行一次ProcessDotOperation,父程序运行一次ProcessDotOperation,然后程序继续运行?

感谢任何帮助。

编辑

如果我在 fork() 之前打印,并将 w = waitpid(pID, &status, WNOHANG); 更改为 w = waitpid(pID, &status , 0);,这是输出:

fork

parent

child

fork

parent

child

继续执行...

这是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);
}
}

最佳答案

有人第二次调用 MultiProcessDot。

关于c++ - fork 子和父运行单独的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9918094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com