定义:
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
信号量解决方法:
item B[k];//K个缓冲区
semaphore empty=k,full=0,metux=1;//空的和满的缓冲区的个数,以及互斥信号量
int in=0,out=0;//指针
cobegin
process producer_i(){//生产者进程
while(1){
produec();//生产产品
P(empty);//对空信号量进行操作
P(mutex);
append to B[in];
in=(in+1)%k;//向缓冲区中放置一个
V(mutex);
V(full);//对满信号量操作
}
}
coend
cobegin
process consumer_i(){//消费者进程
while(1){
P(full);//对满信号量操作
P(mutex);
take from B[out];
out=(out+1)%k;//从缓冲区中取走一个
V(mutex);
V(empty);//对空信号量操作
consume();
}
}
读者写者问题
“读者—写者”问题—记录型信号量
一个数据文件或记录可被多个进程共享。
只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象
“读者—写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。
对于一个文件,同一时间允许多个读者读,只允许一个写者写。
int count=0;//在读的个数
semaphore mutex=1,writeblock=1;//二元信号量,和读者锁
cobegin
process reader_i(){
P(mutex);
count++;
if(count==1) P(writeblock);
V(mutex);
{读文件}
P(mutex);
count--;
if(count==0)V(writeblock);
V(mutex);
}
cend
cobegin
process writer_i(){
P(writeblock);
{写操作}
V(writeblock);
}
coend
理发师睡眠问题:
1、没有顾客,理发师睡觉
2、某位顾客到来,顾客必须叫醒理发师
3、如果顾客到来后,理发师在理发,如果有空椅子,等待,没有的话,离开。
int waiting=0,chair=n;//等待的顾客数
semaphore customers=0,babres=0,mutex=1;
cobegin
proecss baber(){
while(1){
P(customers);
P(mutex);
waiting--;
V(babres);//理发师喊来顾客理发
V(mutex);
}
}
coend
cobegin
process customer(){
P(mutex);
if(waiting<chairs){
waiting++;
V(customers);
V(mutex);
P(barbres);
get_haircut();
}else V(mutex);
}