Проблема параллелизма (тупик?) - PullRequest
0 голосов
/ 02 июня 2019

У меня есть один сервер и несколько клиентов. Сервер использует первую функцию через свою основную функцию, а клиенты вызывают вторую функцию через поток (один клиент использует один поток для чтения в бесконечном цикле).

Это для школьного задания, конечная цель - передать структуру gameData через общую память, чтобы воссоздать игру Arkanoid

BOOL EmitBroadcast(JOGO * structure) {//called by the server
    WaitForSingleObject(hMutexServer, WAIT_ABANDONED);
    structure->numPlayersAtivosAux = structure->numPlayersAtivos;

    memcpy(pBufGameData, structure, sizeof(JOGO));

    ReleaseMutex(hMutexServer);
    SetEvent(hServerHasWritten);

    return TRUE;
}

JOGO ReceiveBroadcast(JOGO * structure) {//used by the client's thread in loop
    //R/W de Michel Raynal 
    WaitForSingleObject(hServerHasWritten, INFINITE);
    WaitForSingleObject(hMutexCliente, INFINITE);//lock r

    structure= &(*pBufGameData);

    if (structure->numPlayersAtivosAux == structure->numPlayersAtivos) {
        WaitForSingleObject(hMutexServer, INFINITE);//lock g
    }

    structure= pBufGameData;

    (structure->numPlayersAtivosAux)--;
    memcpy(pBufGameData, structure, sizeof(JOGO));

    if (structure->numPlayersAtivosAux == 0) {
        ReleaseMutex(hMutexServer);//unlock g
        ResetEvent(hServerHasWritten);
    }

    ReleaseMutex(hMutexCliente);//unlock r

    return * structure;
}

void receiveLoop(LPVOID lParam) {//client thread loop function
    JOGO * gameInfoIn = (JOGO *)lParam;

    do {
        *gameInfoIn = ReceiveBroadcast(gameInfoIn);
        _tprintf(TEXT("\n%d"), gameInfoIn->vidas);

        Sleep(300);//testing purposes
    } while (closeThreadReceiveLoop || gameInfoIn->vidas != 0);
}

Когда я открываю более одного клиента и сервера, после 1 успешного чтения каждого клиента сервер отправляет правильно, и один клиент блокирует объект WaitForSingleObject (hMutexServer, INFINITE); линия. Ожидаемый результат - несколько успешных чтений.

1 Ответ

0 голосов
/ 02 июня 2019

Хорошо, так как указал Майкл Чурдакис в комментариях, у меня был неправильный параметр в функции WaitForSingleObject.Я обошел это, добавив событие в первый клиент, который блокирует serverMutex.

Это заставляет первый клиентский поток ждать завершения остальных клиентских потоков.Последний поток клиента вызывает событие, и первый клиент может завершить и снять блокировку взаимной блокировки сервера.

Спасибо за комментарии Майкла Чурдакиса и OznOg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...