Редактировать 5 (я понимаю, что это может быть слишком поздно или слишком поздно, так как это, вероятно, домашнее задание, но я просто подумал, как сделать это, используя только семафоры.)
хорошо, вот мой псевдокод:
//shared variables
//the # of men or women in the bathroom
int menCountIn=0;
int womenCountIn=0;
//the # of men or women waiting
int menCountWtg=0;
int womenCountWtg=0;
//whose turn it is to go next
int turn = -1;
//-1 = anybody can go
//0 = only men can go
//1 = only women can go
#define capacity 4
//semaphores
semaphore mutex; //a sort of bathroom key
//mutex will protect menCountIn, womenCountIn, and turn
semaphore waiting;
//waiting protects the variable count of how many people are waiting
//Female thread:
bool in = false; //a thread-specific variable telling me whether I'm in or not
//will be used in an almost-spinlocking type of way
wait(waiting);
womenWaiting++;
signal(waiting);
while(!in){
thread.sleep(60); //to avoid constant spinlock
wait(mutex);
if (menCountIn ==0 && (turn == -1 || turn == 1) && womenIn < capacity)
{
wait(waiting);
womenWtg---; //no longer waiting to get in
signal(waiting);
womenCountIn++; // a women entered
cout << "Woman entered restroom" << endl;
in=true;
}
}//end while loop
thread.sleep(60);//in bathroom taking care of business!
wait(mutex);
womenIn--;
cout << "A woman left the restoom." << endl;
wait(waiting);
if(menWaiting > womenWtg)
{
turn = 0; //men should get in at next opportunity
cout << "It's mens' turn!" << endl;
}
else if (menWaiting == womenWtg == 0)
{
turn = -1; //anybody should be able to get in
}
signal(waiting);
signal(mutex);
Поток "Man" должен вести себя аналогично.Имейте в виду, что семафоры ожидания и мьютекса защищают переменные как мужчин, так и женщин.
Вы сигнализируете мьютекс, прежде чем мужчина / женщина "выйдет" из ванной комнаты.Если я правильно понимаю, мьютекс таков, что в ванной может быть только один пол.Так как вы сигнализируете об этом перед выводом «Мужчина вышел из ванной», женщина может получить мьютекс и войти.
Поскольку мужчины и женщины первоначально ждут два разных семафора, понятно, что некоторые из них попадут вв этот начальный семафор.Оттуда кажется, что вы получаете мьютекс (разделенный между мужчинами и женщинами), а затем, входя в него, вы отпускаете его, прежде чем они выходят.Возможно, вы хотите обозначить здесь семафор «мужчина» или «женщина»?
Редактировать : Я думаю, суть моего ответа такова: мьютекс разделен между мужчинами и женщинами,В вашем коде, когда человек получает мьютекс, в котором, по его словам, он находится, вы уменьшаете ожидание, а затем освобождаете мьютекс.Подумайте об этом последнем шаге немного глубже.Если вы отпускаете мьютекс до того, как они уйдут, что здесь возможно?
Edit2 (в ответ на ваши комментарии) : Как выглядит ваш новый код (Отредактируйте исходное сообщение)?
Это поможет нам абстрагировать код от логики, и тогда мы сможем попытаться правильно структурировать вашу логику и сравнить то, что мы считаем правильным, с тем, что делает ваш код.
Правка3: Ладно, похоже, ты все ближе.Вот некоторые вещи, о которых стоит подумать (я не публикую полное решение, потому что это домашняя работа, и я хочу, чтобы вы учились!)
- Что защищает мьютекс?
- Что такое человек/ женщина защищает?
- Что такое уборнаяКонтроль защиты?
- Что такое защита maxCapacity?
- В каком порядке человек должен получить эти семафоры?
- ...ie Какие семафоры защищают, какие другие семафоры и как?
Особенно серьезно подумайте о семафоре подсчета в уборной ... (СОВЕТ: Это может быть важнее, чем просто защита переменной подсчета. Может потребоватьсязащищать освобождение других семафоров ...)
Редактировать 4: Поэтому я наконец понял, что вы пытаетесь избежать голодной смерти в этой проблеме (как указано в комментариях ниже).Хотя ваша домашняя работа очень похожа на проблему читателей / писателей, дополнительное ограничение во избежание голодания в зависимости от типа потока затрудняет реализацию.Лично я не знаю, как это сделать, не используя События для установки предпочтения (http://msdn.microsoft.com/en-us/library/dd492846.aspx),, и даже в этом случае нет никакой гарантии, что голод никогда не случится, что, если я понимаю статью из Википедии (http://en.wikipedia.org/wiki/Readers-writers_problem#The_third_readers-writers_problem) оэта тема правильно, это единственный способ сделать это.
Вам разрешено использовать события?
Я должен извиниться за то, что не полностью соблюдает это дополнительное ограничение для читателей / писателей, заключающееся в отсутствии голода. Надеюсь, кто-нибудьеще может помочь вам лучше.