題目描述:
現有一個小巷,除安全島可容2人暫時停身外,僅能容一人通過。a,b兩頭都允許行人進出,試用訊號量和pv操作設計一個演算法,讓兩頭的行人順利通過小巷。
解題模型:
sem_t a_s;//程式原始碼:a-s路段
sem_t b_s;//
b-s路段
sem_t island;//
島 sem_t a;//
對a頭的人數進行唯一操作
sem_t b;//
對b頭人數進行唯一操作
sem_t is;//
對island島上的人進行唯一操作
void*a()
v(a);
//a-people操作完成,解鎖
v(a-s); //
釋放 a-s路段 資源
p(b-s); //
請求踏上 b-s路段 ,上鎖
v(island); //
當a過來的人踏上 b-s路段,則釋放island資源,保證資源最大化
;v(b-s); //
解鎖 } }
void*b()
v(b);
//b-people操作完成,解鎖
v(b-s);//
釋放 b-s路段 資源
p(a-s);//
請求踏上 a-s路段 ,上鎖
v(island); //
當b過來的人踏上 a-s路段,則釋放island資源,保證資源最大化
;v(a-s); //
解鎖 }
}
#include #include#include
#include
#include
#include
#define p sem_wait
#define v sem_post
#define a_s &a_s_road
#define b_s &b_s_road
#define island &ab_island
#define a &a_peo
#define b &b_peo sem_t a_s_road;
//臨界資源:a-s路段
sem_t b_s_road;//
臨界資源:b-s路段
sem_t ab_island;//
島 初值為2
sem_t a_peo;//
對a頭的人數進行唯一操作
sem_t b_peo;//
對b頭人數進行唯一操作
int a_people=5;//
a頭的人數
int b_people=5;//
b頭的人數
int island_people=0;//
記錄島上的人數
void* process_a(void *p)
}void* process_b(void *p)
}int
main()