Семафоры и параллельное программирование

Для домашнего задания мне нужно запрограммировать следующий сценарий. Это будет сделано с использованием семафоров с использованием BACI (который является C–)

В отеле есть 2 унисекса, которые могут вмещать до 4 человек. Поскольку это унисекс, люди одного пола могут одновременно находиться в туалете, а FIFO не имеет значения. У меня есть основной «алгоритм» в моей голове, чтобы обращаться с 4 мужчинами и 4 женщинами за 1 уборную. Но я не знаю, как это кодировать. Любая помощь будет принята с благодарностью. Вот что у меня есть.

Woman: Check to see if there are any men in the restroom. If so "wait". If no men check to see if there are 4 people. If so "wait". If no men and not 4 use restroom. When leaving signal there is a vacancy. If last woman signal the men if they are waiting if not signal the woman. Man: check to see if there are any woman in the restroom. if so "wait" If no woman check to see if there are 4 people. If so "wait". If no woman and not 4 use restroom. when leaving signal there is a vacancy. if last man signal the women if they are waiting if not signal the men. 

Эти дополнительные инструкции были предоставлены

Поскольку вы хотите знать, how to code your algorithm for 1 restroom , я сделал это на C. Это будет довольно простая задача, чтобы преобразовать его в C–, так как все конструкции семафора выглядят весьма схожими.

Из того, что я мог бы сделать из вашего ответа,

 C: sem_wait() C--: wait() sem_post() signal() sem_t semaphore() sem_init() initialsem() 

Имейте в виду, как было сказано, я разработал проблему только для 1 туалета . Поскольку это домашнее задание, я ожидаю, что вы расширите его в 2-туалетах .

Работая на пути от проблемы читателей-писателей к нашей проблеме «Unisex Restroom», мы используем следующие глобальные переменные:

 int mcount,wcount; // count of number of men/women in restroom sem_t x,y,z; // semaphores for updating mcount & wcount values safely sem_t wsem,msem; // semaphores to block other genders' entry sem_t cap; // capacity of the restroom 

Включение этих семафоров и счетчиков в функцию man streamа,

 void *man(void *param) { sem_wait(&z); sem_wait(&msem); sem_wait(&x); mcount++; if(mcount==1) { sem_wait(&wsem); } // first man in, make women wait sem_post(&x); sem_post(&msem); sem_post(&z); sem_wait(&cap); //wait here, if over capacity printf("\t\tman in!\n"); delay(); printf("\t\t\tman out!\n"); sem_post(&cap); //one man has left, increase capacity sem_wait(&x); mcount--; if(mcount==0) {sem_post(&wsem);} // no man left, signal women sem_post(&x); } 

Аналогично, функция женской нити, заменяет mcount с wcount , msem с wsem и x с y . Только z остается таким же, как и в функции man , так что и man и woman streamи стоят на одном общем семафоре. (Из-за этого код неизменно имеет FIFO-подобное поведение, которое обеспечивает справедливость / не-голодание )

Полный код выглядит следующим образом: (Чтобы скомпилировать, используйте gcc filename -lpthread )

 #include  #include  #include  #include  int mcount,wcount; sem_t x,y,z,wsem,msem,cap; void delay(void) { int i; int delaytime; delaytime = random(); for (i = 0; i 

Преобразуясь в форму 2-туалета , обратите внимание на то, какие семафоры и счетные переменные вам нужно будет дублировать, чтобы удовлетворить все условия. Счастливые семафоры !

Вот что у меня есть. Это позволяет одному человеку в туалете одновременно без тупика или голода. Мне нужна помощь в том, как сделать так, чтобы 4 человека могли находиться в туалете за раз.

 const int Delayx = 60; int i; semaphore max_capacity; semaphore woman; semaphore man; semaphore mutex; void Delay(void) { int DelayTime; DelayTime = random(Delayx); for (i = 0; i 

для 4-х туалетов код baci:

  const int Delayx = 60; int i; int Mcount,Wcount; binarysem x,y,z,Wsem,Msem; semaphore cap; void Delay(void) { int DelayTime; DelayTime = random(Delayx); for (i = 0; i