题目:
进程A1、A2、…n1.通过m个缓冲区向进程B1、B…n.不断地发送
消息。发送和接收工作遵循如下规则:
(1) 每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于
消息长度;
(2)对每一个消息,B1,B2,…,. Bn都必须接收一次,读入各自的数据区内。
m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。
semaphore mutex=1; //用于所有进程互斥访问缓存区buffer,以及in,out变量
semaphore empty = m, full = 0;
int in = 0, out = 0;
buffer[m];
semaphore mutex2 = 0; //用于互斥访问rcount,flag;
int rcount = 0; //用于记录当前in所指的消息有多少个B类进程已接收
int flag[n2] = {0,0,0,0,....,0}; //flag[i]==1表示Bi已经取过buffer[in]中的消息了
void A(int i) //进程Ai 下标从0开始
{
while(true)
{
准备要发送的消息;
wait(empty);
wait(mutex);
buffer[in] = 要发送的消息;
in = (in+1)%m;
signal(mutex);
signal(full);
}
}
void B(int i) //Bi下标从0开始
{
while(true)
{
wait(mutex2);
if(flag[i] == 0)
{
wait(full);
wait(mutex);
将buffer[out]所存的消息取出;
flag[i] = 1;
rcount++;
if(rcount == n2)
{//Bi是B类进程最后一个读该消息的进程
out = (out+1)%m;
signal(empty);
//将flag、rcount重置
for(int j = 0; j < n2; j++) flag[j] = 0;
rcount = 0;
}
else
{//不是应signal(full)一次补偿被自己消耗的full
signal(full);
}
signal(mutex);
}
signal(mutex2);
}
}
int main()
{
cobegin:
for(int i = 0; i < n1; i++) A(i);
for(int j = 0; j < n2; j++) B(j);
coend;
return 0;
}