叉子和父运行单独的代码

时间:2012-03-29 01:48:50

标签: c++ fork shared-memory

我正在尝试对产品两个向量进行点缀,每个过程都采用单独的起始和结束索引。似乎正在发生的是代码被执行两次。

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

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

如何使子进程运行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);
    }
}

2 个答案:

答案 0 :(得分:2)

有人第二次调用MultiProcessDot。

答案 1 :(得分:1)

我认为你需要围绕waitpid()进行循环。如上所述,你等了一次,没有为一个死去的孩子闲逛,如果孩子还没死,就立即回来。这允许父母继续进行其他活动。

我不确定这是对你观察到的内容的完整解释,但是我们看不到你的跟踪代码。用每条消息打印过程的PID。