Sincronização de banheiro e fila de threads
Para o dever de casa, recebemos o problema de sincronização do banheiro. Eu tenho lutado tentando descobrir como começar. O que eu gostaria de fazer quando uma pessoa entra no banheiro (função personEnterRestrrom), se elas são do sexo feminino e não há homens no banheiro, se não entrarem em uma fila para mulheres esperando. Eu quero fazer o mesmo para os homens. Eu tentei implementar uma fila que contém thread, mas não consegue fazê-lo funcionar. Então, na função personLeavesRestroom. Quando uma pessoa sai, se ninguém é deixado no banheiro, a outra fila começa. Aqui está o meu código, sei que estou longe, preciso de orientação e não estou muito familiarizado com semáforos.
<code>//declarations pthread_mutex_t coutMutex; int menInBath; int womanInBath; int menWaiting; int womenWaiting; queue<pthread_mutex_t>men; queue<pthread_mutex_t>women; personEnterRestroom(int id, bool isFemale) { // LEAVE THESE STATEMENTS pthread_mutex_lock(&coutMutex); cout << "Enter: " << id << (isFemale ? " (female)" : " (male)") << endl; pthread_mutex_unlock(&coutMutex); // TODO: Complete this function if(isFemale && menInBath<=0) { womanInBath++; } else if(isFemale && menInBath>0) { wait(coutMutex); women.push(coutMutex); } else if(!isFemale && womanInBath<=0) { menInBath++; } else { wait(coutMutex); men.push(coutMutex); } </code>
}
<code> void personLeaveRestroom(int id, bool isFemale) { // LEAVE THESE STATEMENTS pthread_mutex_lock(&coutMutex); cout << "Leave: " << id << (isFemale ? " (female)" : " (male)") << endl; pthread_mutex_unlock(&coutMutex); if(isFemale) womanInBath--; if(womanInBath==0) { while(!men.empty()) { coutMutex=men.front(); men.pop(); signal(coutMutex); } } } </code>