Jen*_*Jen 11 c++ mutex semaphore
我正在写一个模拟男女皆宜的浴室的程序(用于家庭作业).一次只允许4个人,如果其他性别已经在使用浴室,男女不能进入.我的问题是允许最多4人在浴室.从输出中可以看出,一次只有一个人进入洗手间.这是我的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这会生成以下输出:
一个男人进入洗手间
的洗手间:1一名男子已退出洗手间
的洗手间:0一个男人进入洗手间
的洗手间:1一名男子已退出洗手间
的洗手间:0一位女士进入洗手间
的洗手间:1一名妇女已退出洗手间
的洗手间:0一位女士进入洗手间
的洗手间:1一名妇女已退出洗手间
的洗手间:0
等等,永远.
我认为你的信号量太多了。您的男性/女性信号量一次选通至 1 个人。考虑使用一些受互斥锁保护的状态变量(浴室的当前性别、浴室中的人数)而不是这么多不同的信号量。
您是否保持排队顺序,或者人们可以根据当前的卫生间性别跳过排队吗?例如,如果有女人,女人,女人,男人,女人,是第4个女人允许跳过男人进入洗手间,或者3个女人退出,然后男人进入/退出,然后女人可以进入?这是一个比允许跳过更容易的问题。
| 归档时间: |
|
| 查看次数: |
9350 次 |
| 最近记录: |