синхронизация ванной комнаты и очередь потоков
Для домашней работы нам дали проблему синхронизации ванной. Я изо всех сил пытался понять, как начать. Что я хотел бы сделать, когда человек входит в туалет (функция personEnterRestrrom), если он - женщина, и в туалете нет ни одного мужчины, которого он входит, если нет, то он входит в очередь для ожидающих женщин. Я хочу сделать то же самое для мужчин. Я попытался реализовать очередь, которая содержит поток, но не может заставить его работать. Тогда в функции personLeavesRestroom. Когда человек уходит, если никого не осталось в ванной, начинается другая очередь. Вот мой код, я знаю, что я далеко, потому что мне нужно некоторое руководство, и я не очень знаком с семафорами.
<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>