现有100名毕业生去甲、乙两公司求职,两公司合用一间接待室,其中甲公司招 收10 人,乙公司准备招收10人,招完为止。两公司各有一位人事主管在接待毕业生, 每位人事主管每次只可接待一人,其他毕业生在接待室外排成一个队伍等待。试用信 号量和P 、V 操作实现人员招聘过程。
由于毕业生仅排成一队,故用如图的一个队列数据结构表示。在队列中不含甲、乙公司.
A B A A B Sm
A B Sn
B A ...
都接待过的毕业生和己被录用的毕业生。只含标识为A (被甲接待过)或只含标识为B (被乙接待过)及无标识的毕业生队列。此外,sm 和Sn 分别为队列中甲、乙正在面试的毕业生i ( i = 1 , 2 ,…,100 )标识、即此刻另一方不得面试该毕业生i 。K1和K2 为甲、乙所录取的毕业生数,C1 、C2 为互斥信号量。注意,如果甲录取了一人,且该生没有被乙面试的话,则乙面试的毕业生将减1 。办法是:如果甲录取了一人,且该生没有被乙面试可把乙的面试计数器C2加1 (相当于乙己面试了他),从而,保证乙面试的人数值为100 。反之对甲亦然。
var Sa,Sb,mutex:semaphore;
Sa:=Sb:=mnutex:=1;
C1,C2,K1,K2:integer;
C1:=C2:=K1:=K2:=0;
cobegin
process 甲公司
begin
L1: P(mutex);
P(Sa);
C1:==C1+1 ;
V(Sa);
If C1≤100 then
{
从标识为B 且不为Sn 或
无标识的毕业生队列中选
第i 个学生,将学生i 标
识为A 和Sm
}
V(mutex) ;
面试;
P(mutex);
if 合格then
{ K1:=K1+1;
if 学生i 的标识不含B then
{
P (Sb);
C2:=C2+1;
V(Sb);
将学生i 从队列摘除;
}
else 将学生i 从队列摘除;
} else if 学生i 的标识含B then
将学生i 从队列摘除;
else
取消学生i 的Sm 标识;
V(mutex);
If(K1<10)&(C2<100) then
goto L1;
end
process 乙公司
begin
L2:P(mutex);
P(Sb);
C2:=C2+1;
V(Sb);
if C2≤100 then
从标识为A 且不为sm 或无标识的
毕业生队列中选第i个学生将学生i
标识为B和Sn
V(mutex);
面试;
P(mutex);
if 合格then
{ K2:=K2+1;
if 学生i 的标识不含A then
{ P(Sa)
C1:=C1+1;
V(Sa);
将学生i 从队列摘除;
} else 将学生i 从队列摘除;
} else if 学生i 的标识含A then
将学生i 从队列摘除;
else
取消学生i 的Sn 标识;
V(mutex);
if(K2<10)&(c1<100)then
goto L2;
end coend