[英]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
注意:我可能對所發生的事情有基本的誤解,因此,對於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);
}
}
有人第二次調用MultiProcessDot。
我認為您需要在waitpid()
周圍循環。 按照本文所述,您可以等待一次,而不必四處尋找死去的孩子,如果孩子還沒死,則立即返回。 當然,這允許父母繼續其他活動。
我不確定這是否是您所觀察到的完整解釋,但是我們看不到您的跟蹤代碼。 在每條消息中打印諸如進程的PID之類的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.