Я пытаюсь разбить произведение на два вектора, причем каждый процесс имеет отдельный начальный и конечный индексы.Кажется, что происходит то, что код выполняется дважды.
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);
, вот вывод:
разветвление
родительский
дочерний
разветвление
родитель
ребенок
продолжениеinued выполнение ...
Вот код 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);
}
}