【发布时间】:2011-04-20 12:18:32
【问题描述】:
我正在编写一个模拟男女通用浴室的程序(用于家庭作业)。一次只允许 4 人进入,如果异性已经在使用浴室,则男女不能进入。我的问题是最多允许 4 人进入浴室。从输出中可以看出,一次只有 1 人进入洗手间。这是我的代码:
const int Delayx = 60;
int i;
int restroom = 0;
int Menwaiting = 0;
int Womenwaiting = 0;
semaphore max_capacity;
semaphore woman;
semaphore man;
semaphore mutex;
semaphore restroomcount;
void Delay(void)
{
int DelayTime;
DelayTime = random(Delayx);
for (i = 0; i<DelayTime; i++);
}
void Woman(void)
{
// for(;;){
Womenwaiting++;
//wait(mutex);
wait(woman);
wait(max_capacity);
//wait(woman);
wait(mutex);
wait(restroomcount);
cout << "A Woman has entered Restroom"<<endl;
cout << "People in the Restroom:" << restroom++ <<endl <<endl;
signal(restroomcount);
Womenwaiting--;
Delay();
wait(restroomcount);
cout << "A woman has exited Restroom"<<endl;
cout << "People in the Restroom:" << restroom-- <<endl<<endl;
signal(restroomcount);
signal(mutex);
signal(max_capacity);
if(Menwaiting > Womenwaiting){
signal(man);
}
else{
signal(woman);
}
//signal(max_capacity);
//signal(man);
// }
}
void Man(void)
{
// for(;;){
Menwaiting++;
//wait(mutex);
wait(man);
wait(max_capacity);
//wait(man);
wait(mutex);
wait(restroomcount);
cout <<"A Man has entered the Restroom"<<endl;
cout <<"People in the Restroom:" << restroom++ <<endl<<endl;
signal(restroomcount);
Menwaiting--;
//signal(mutex);
Delay();
//wait(mutex);
wait(restroomcount);
cout << "A man has exited the Restroom"<<endl;
cout <<"People in the Restroom:" << restroom-- <<endl<<endl;
signal(restroomcount);
signal(mutex);
signal(max_capacity);
if(Womenwaiting > Menwaiting){
signal(woman);
}
else{
signal(man);
}
//signal(max_capacity);
//signal(woman);
//}
}
void main()
{
initialsem(woman,1);
initialsem(man,1);
initialsem(max_capacity,4);
initialsem(mutex,1);
initialsem(restroomcount,1);
cobegin
{
Woman(); Woman(); Woman(); Woman(); Woman(); Man(); Man(); Man(); Man(); Man();
}
}
这会生成以下输出:
一个男人进了洗手间
厕所里的人:1一个男人离开了洗手间
厕所里的人:0一个男人进了洗手间
厕所里的人:1一个男人离开了洗手间
厕所里的人:0一个女人进了洗手间
厕所里的人:1一个女人已经离开了洗手间
厕所里的人:0一个女人进了洗手间
厕所里的人:1一个女人已经离开了洗手间
厕所里的人:0
等等,直到永远。
【问题讨论】:
-
如果洗手间里已经有女性,该代码的哪一部分应该负责防止男性进入洗手间,反之亦然?
-
这个分配应该是单线程的吗?使用线程?协程?
-
@dgnorton - 信号量。我正在使用一个名为 BACI 的解释器来模拟并发进程。
-
我知道这是一个作业,但它真的需要使用信号量来完成吗(它是一个信号量练习)吗?条件变量可以更容易地描述男性/女性可以进入的条件:您只需在条件发生变化时发出信号,线程会检查自己是否可以进入。