2012-05-08 2 views
-4

Можно создать дубликат:
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); 

    } 
} 

}

+2

Хм, кто-то еще отправил вопрос на это же задание пару дней назад. –

+2

@SamDufel: http://stackoverflow.com/questions/3850491/mutual-exclusion-and-semaphores (oops 2010!) – Flexo

ответ

0

Ну, как и в awoodland, они уже связаны с другой нитью на SO, так что это хорошо, чтобы взглянуть на нее. На всякий случай, чтобы избежать дублирования решений одной и той же проблемы в одном классе, я также спрошу вас, является ли использование семафора обязательным?

Если нет, то просто создайте структуру очереди (сначала в первом порядке) и помещайте каждого входящего человека в очередь. Когда приходит новый человек, примените логику доступности ванной. Также, когда человек выходит из ванной комнаты, снова примените логику ванной, если очередь не пуста. И это для вас.

+0

Мы должны использовать семафоры. Я посмотрел на другие темы, я думаю, что есть что-то о логике, которую я просто не понимаю – Aaron

Смежные вопросы