Дочерний и родительский вилки работают с отдельным кодом - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь разбить произведение на два вектора, причем каждый процесс имеет отдельный начальный и конечный индексы.Кажется, что происходит то, что код выполняется дважды.

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

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Кто-то вызывает MultiProcessDot во второй раз.

1 голос
/ 29 марта 2012

Я думаю, вам нужен цикл вокруг waitpid().Как написано, вы ждете один раз, не слоняясь за мертвым ребенком, и возвращаетесь немедленно, если ребенок еще не умер.Это, конечно, позволяет родителю продолжать другие действия.

Я не уверен, что это полное объяснение того, что вы наблюдаете, но мы не можем увидеть ваш код трассировки.Печатайте такие вещи, как PID процесса, с каждым сообщением.

...