Можно создать дубликат:
bathroom synchronization and queue of threadsTrouble figuing из логики для ванной Syncronization
Я смотрел на подобные вопросы в стек и использовать Google, они не помогли мне ответить на мой вопрос. Для домашней работы мне была дана проблема синхронизации ванной. Общая ванная комната, женщина не может использовать, пока мужчина там, и наоборот. Я пытаюсь выяснить, как остановить и перезапустить поток, если другой секс находится в ванной комнате. Пока у меня есть несколько условий, которые, если кто-то из противоположного пола не туда, и если я не скажу, что семафор ждет. Затем, когда выходите, если в вашем туалете не останется ни одного вашего пола, позвольте другому сексу (семафор идти). Я не знаю. Если у меня возникнут проблемы с тем, когда нужно блокировать потоки или ждать семафоров. Вот мой код.
// мои переменные
sem_t male;
sem_t female;
int maleInBath;
int femaleInBath;
pthread_mutex_t coutMutex;
// инициализировать переменные
void personInitGlobals()
{
// LEAVE THIS STATEMENT
pthread_mutex_init(&coutMutex, NULL);
// TODO: Complete this function
int init=0;
maleInBath=0;
femaleInBath=0;
sem_init(&male, 0, init);
sem_init(&female, 0, init);
}
// введите уборной
void 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 && maleInBath==0){
femaleInBath++;
}else if(isFemale && maleInBath >0){
sem_wait(&female);
}else if(!isFemale && femaleInBath==0){
maleInBath++;
}else{
sem_wait(&male);
}
}
человек покидает уборную
void personLeaveRestroom(int id, bool isFemale)
{
// LEAVE THESE STATEMENTS
pthread_mutex_lock(&coutMutex);
cout << "Leave: " << id << (isFemale ? " (female)" : " (male)") << endl;
pthread_mutex_unlock(&coutMutex);
// TODO: Complete this function
if(isFemale){
femaleInBath--;
if(femaleInBath==0){
sem_post(&male);
}
}else{
maleInBath--;
if(maleInBath==0){
sem_post(&female);
}
}
}
Хм, кто-то еще отправил вопрос на это же задание пару дней назад. –
@SamDufel: http://stackoverflow.com/questions/3850491/mutual-exclusion-and-semaphores (oops 2010!) – Flexo