- 假設進程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();
}
}
大致如此,先丟在這裏,明天去仿真模擬環境再試試