- 假设进程P0对变量V0和V1执行递增操作,进程P1对变量V1和V2执行递减操作,进程P2对变量V2执行递增操作,对变量V0执行递减操作。这三个进程并发执行,请给出一段代码,说明使用信号量操作如何避免临界区问题的发生。
//3个临界资源,对应为下面的v1,v2,v3
//没有前驱关系,有2个临界区
int v0=0,v1=10,v2=100;
semaphore a=1.b=1,c=1;
void p0(){wait(a);v0++;signal(a);wait(b);v1++;signal(b)}
void p1(){wait(b);v1--;signal(b);wait(c);v2--;signal(c)}
void p2(){wait(a);v0--;signal(a);wait(c);v2++;signal(c)}
main()
{
cobegin{
p0();p1();p2();
}
cout<<'\n'<<"v0=0"<<'\t'<<"v1="<<v1<<'\t'<<"v2="<<v2<<endl;
}
- 设有售票大厅可容纳200人购票,如果厅内不足200人则允许进入,超过则在厅外等候;售票员只能给一个购票者服务,购票者买票后即离开售票大厅。试问
(1)购票者之间是否存在制约关系?
(2)给出一段代码,说明如何使用信号量机制解决临界区问题。
//购票者之间存在制约关系,他们之间表现为互斥关系
//举例为仅设置10个购票者来观察情况
int ticket_saled=0;
semaphore ticket_lobby=5;
semaphore conductor=1;
atomic void printpasStr(int id){cout<<id<<"'s passenger done."<<endl;}
void passenger(int id){
wait(ticket_lobby);
wait(conductor);
ticket_saled++;
signal(conductor);
signal(ticket_lobby);
printpasStr(id);
}
void main(){
cobegin{
passenger(1);passenger(2);passenger(3);passenger(4);passenger(5);
passenger(6);passenger(7);passenger(8);passenger(9);passenger(10);
}
cout<<"the saled ticket is:"<<ticket_saled<<endl;
}
这里能够得到相应的结果,举例为仅设置10个购票者;来观察情况
- 有四个进程ABCD,共享同一个缓冲区。进程A向缓冲区中写入消息,其它3个进程从缓冲区中读取消息。要求进程A必须等其它3个进程都读取消息后才能发送下一条消息。缓冲区一次只能容纳一条消息。请给出一段代码,说明如何使用信号量机制实现这4个进程存取消息的过程。
//A、B之间,A、C之间,A、D之间存在临界资源
//读、写操作互为临界区
int buffer;
int data=0;
semaphore ab=0,ac=0,ad=0,ba=1,ca=1,da=1;
void A(){
while(1){
wait(ba);wait(ca);wait(da);
buffer=data++;
signal(ab);signal(ac);signal(ad);
}
}
void B(){
while(1){
wait(ab);
cout<<"R1-read:"<<buffer<<endl;
signal(ba);
}
}
void C(){
while(1){
wait(ac);
cout<<"R2-read:"<<buffer<<endl;
signal(ca);
}
}
void D(){
while(1){
wait(ad);
cout<<"R3-read:"<<buffer<<endl;
signal(da);
}
}
void main(){
cobegin{
A();B();C();D();
}
}
大致如此,先丢在这里,明天去仿真模拟环境再试试