学习记录
欢迎大家一起学习,共同分享学习经验!
生产者-消费者问题
semaphore full=0; //满冲存数目
semaphore empty=n; //空冲存数目
semaphore mutex=1; //对有界缓冲
producer()
{
while(ture)
{
produce an item put in nextp; //nextp为临时缓冲池
P(empty); //申请一个空缓冲池
P(mutex); //申请使用缓冲池
将产品放入缓冲池;
V(mutex); //释放互斥信号量
V(full); //增加一个满缓冲区
}
}
consumer()
{
while(ture)
{
P(full); //申请一个满缓冲池
P(mutex); //申请使用缓冲池
取出产品;
V(mutex); //释放互斥信号量
V(empty); //增加一个空缓冲区
consumer the item in nextc; //消费产品
}
}
其中P(full)/P(empty)与P(mutex)的顺序不能颠倒,必须先对资源信号量进行P操作,再对互斥信号量进行P操作,否则会导致死锁。
P操作(wait操作)相当于此类资源数量-1;V操作(signal操作)相当于此类资源数+1
理发师问题
理发椅、等待椅子、顾客看做不同的量
int waiting=0; //顾客数量
semaphore mutex=1; //用于互斥操作waiting
semaphore bchair=1; //理发椅的信号量
semaphore wchair=n; //等待座椅的信号量
semaphore ready=finish=0; //理发师与顾客的同步信号量
barber() //理发师进程
{
while(ture)
{
P(ready); //叫一位顾客来理发
理发;
V(finish); //声明理发已经结束,已空闲
}
}
customer() //顾客进程
{
P(mutex) //写waiting权限
if(waiting<=n) //如果还有空座位
{
waiting++; //等待数加1
V(mutex); //释放让别人也可以使用waiting变量
}
else
{
V(mutex);
离开;
}
P(wchair); //占用等待座椅
P(bchair); //占用理发座椅
V(wchair); //离开等待座椅
V(ready); //离开等待位置去理发
P(finish); //占用理发师
V(bchair); //理发结束离开理发椅
P(mutex); //占用使用waiting变量权限
waiting--;
V(mutex);
}
顾客、凳子、理发椅统一为一个变量
int chairs=n+1; //凳子和理发椅
semaphore ready=0; //等待理发顾客数量
semaphore finish=1; //理发师状态
semaphore mutex=1; //互斥信号量
barber()
{
while(ture)
{
P(ready); //检查有没有要理发的顾客
理发;
P(mutex); //申请对chairs操作权限
chairs++; //空闲座位+1
V(mutex); //释放互斥信号量
V(finish); //理发师空闲
}
}
customer()
{
P(mutex); //申请使用chairs变量值
if(chairs>0) //如果还有座位
{
chairs--; //空闲座位-1
V(mutex); //释放互斥信号量
V(ready); //等待状态、等待理发师
P(finish); //开始理发、占用理发师
}
else
V(mutex); //直接离开
}
哲学家进餐问题
(哲学家按照编号逆时针围桌而坐,0号哲学家左手筷子为0号筷子,右手筷子为1号筷子,依次类推)
为了避免死锁,规定奇数号的哲学家先拿起左边筷子,然后拿起右边筷子;偶数号的哲学家则相反
semaphero Fork[5]={1,1,1,1,1}; //五根筷子信号量初值都为1
philosopher(int i) //i=1,2,3,4,5
{
while(ture)
{
思考;
想吃饭;
if(i%2 !=0)
{
P(Fork[i]; //拿起左边筷子
P(Fork[(i+1)%5]); //拿起右边筷子
进餐;
V(Fork[i]);
V(Fork[(i+1)%5]);
}
else
{
P(Fork[(i+1)%5]); //拿起右边筷子
P(Fork[i]; //拿起左边筷子
进餐;
V(Fork[(i+1)%5]);
V(Fork[i]);
}
}
}