У меня есть один сервер и несколько клиентов. Сервер использует первую функцию через свою основную функцию, а клиенты вызывают вторую функцию через поток (один клиент использует один поток для чтения в бесконечном цикле).
Это для школьного задания, конечная цель - передать структуру 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); линия. Ожидаемый результат - несколько успешных чтений.