对于家庭作业,我需要规划以下场景。这将使用使用BACI (即C-)的信号量来完成。
有2间男女同床共枕的洗手间,每个可容纳4人。因为它是男女同性别的,只有同性别的人可以同时在洗手间,而FIFO并不重要。我有一个基本的“算法”在我的头脑中处理4个男人和4个女人在一个洗手间。但我不知道该怎么编码。任何帮助都将不胜感激。这是我所拥有的。
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.提供了这些额外的指示
发布于 2010-10-08 17:39:51
因为您想知道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洗手间“问题,我们使用了以下全局变量:
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线程函数中,
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线程都在同一个通用信号量上排队。(正因为如此,代码始终具有类似于fairness/non-starvation)的FIFO行为,从而确保了。
完整的代码如下(要编译,使用gcc filename -lpthread)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
int mcount,wcount;
sem_t x,y,z,wsem,msem,cap;
void delay(void)
{
int i;
int delaytime;
delaytime = random();
for (i = 0; i<delaytime; i++);
}
void *woman(void *param)
{
sem_wait(&z);
sem_wait(&wsem);
sem_wait(&y);
wcount++;
if(wcount==1)
{ sem_wait(&msem); }
sem_post(&y);
sem_post(&wsem);
sem_post(&z);
sem_wait(&cap);
printf("woman in!\n");
delay();
printf("\twoman out!\n");
sem_post(&cap);
sem_wait(&y);
wcount--;
if(wcount==0)
{ sem_post(&msem); }
sem_post(&y);
}
void *man(void *param)
{
sem_wait(&z);
sem_wait(&msem);
sem_wait(&x);
mcount++;
if(mcount==1)
{ sem_wait(&wsem); }
sem_post(&x);
sem_post(&msem);
sem_post(&z);
sem_wait(&cap);
printf("\t\tman in!\n");
delay();
printf("\t\t\tman out!\n");
sem_post(&cap);
sem_wait(&x);
mcount--;
if(mcount==0)
{sem_post(&wsem);}
sem_post(&x);
}
int main(void)
{
int i;
srandom(60);
mcount = 0;
wcount = 0;
sem_init(&x,0,1); // for sem_init, initial value is 3rd argument
sem_init(&y,0,1);
sem_init(&z,0,1);
sem_init(&wsem,0,1);
sem_init(&msem,0,1);
sem_init(&cap,0,4); // eg. cap initialized to 4
pthread_t *tid;
tid = malloc(80*sizeof(pthread_t));
// You can use your cobegin statement here, instead of pthread_create()
// I have forgone the use of pthread barriers although I suppose they would nicely imitate the functionality of cobegin.
// This is merely to retain simplicity.
for(i=0;i<10;i++)
{
pthread_create(&tid[i],NULL,woman,NULL);
}
for(i=10;i<20;i++)
{
pthread_create(&tid[i],NULL,man,NULL);
}
for(i=0;i<20;i++)
{
pthread_join(tid[i],NULL);
}
return(0);
}在转换为2-休息室表单时,请注意您需要复制哪些信号量和计数器变量,以满足所有条件。信号传递快乐!
发布于 2010-10-03 01:24:08
这是我所拥有的。这允许一个人一次在厕所没有死锁或饥饿。我需要帮助,如何使它,以便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<DelayTime; i++);
}
void Woman(void)
{
wait(woman);
wait(max_capacity);
wait(mutex);
cout << "A Woman has entered Restroom"<<endl;
Delay();
cout << "A woman has exited Restroom"<<endl;
signal(mutex);
signal(max_capacity);
signal(man);
}
void Man(void)
{
wait(man);
wait(max_capacity);
wait(mutex);
cout <<"A Man has entered the Restroom"<<endl;
Delay();
cout << "A man has exited the Restroom"<<endl;
signal(mutex);
signal(max_capacity);
signal(woman);
}
void main()
{
initialsem(woman,1);
initialsem(man,1);
initialsem(max_capacity,4);
initialsem(mutex,1);
cobegin
{
Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Woman(); Man(); Man(); Man(); Man(); Man(); Man(); Man(); Man();
}
}发布于 2011-02-28 20:59:00
4间洗手间的杆菌码:
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<DelayTime; i++);
}
void Woman(void)
{
wait(z);
wait(Wsem);
wait(y);
Wcount++;
if(Wcount==1)
{ wait(Msem); }
signal(y);
signal(Wsem);
signal(z);
wait(cap);
cout << "A Woman has entered Restroom"<<endl;
Delay();
cout << "A Woman has exited Restroom"<<endl;
signal(cap);
wait(y);
Wcount--;
if(Wcount==0)
{signal(Msem);}
signal(y);
}
void Man(void)
{
wait(z);
wait(Msem);
wait(x);
Mcount++;
if(Mcount==1)
{ wait(Wsem); }
signal(x);
signal(Msem);
signal(z);
wait(cap);
cout << "A Man has entered Restroom"<<endl;
Delay();
cout << "A Man has exited Restroom"<<endl;
signal(cap);
wait(x);
Mcount--;
if(Mcount==0)
{signal(Wsem);}
signal(x);
}
void main()
{
Mcount=0;
Wcount=0;
initialsem(x,1);
initialsem(y,1);
initialsem(z,1);
initialsem(Wsem,1);
initialsem(Msem,1);
initialsem(cap,4);
cobegin
{
Woman(); Woman(); Woman();
Woman(); Woman(); Woman();
Woman();
Woman(); Man(); Man();
Man(); Man(); Man(); Man();
Man(); Man();
}
}https://stackoverflow.com/questions/3848063
复制相似问题