簡體   English   中英

叉子孩子和父母運行單獨的代碼

[英]Fork child and parent running separate code

我正在嘗試對兩個向量進行點積運算,每個過程都采用單獨的起始索引和結束索引。 似乎正在發生的事情是該代碼被執行了兩次。

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

  • 打印“活着”

  • 父級運行ProcessDotOperation

  • 打印“活着”

  • 程序繼續執行(繼續執行其他功能)

  • 子級運行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);
    }
}

有人第二次調用MultiProcessDot。

我認為您需要在waitpid()周圍循環。 按照本文所述,您可以等待一次,而不必四處尋找死去的孩子,如果孩子還沒死,則立即返回。 當然,這允許父母繼續其他活動。

我不確定這是否是您所觀察到的完整解釋,但是我們看不到您的跟蹤代碼。 在每條消息中打印諸如進程的PID之類的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM