生产者和消费者问题
生产者和消费者问题
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
分析问题:生产者和消费者共享同一个缓冲池,同时访问是可能会发生数据的不准确型。同一时间允许一个进程进行访问,即可解决问题。
- 利用记录型信号量解决问题
假设共享的缓冲池中有n个缓冲区,利用互斥型号量mutex实现对诸线程对缓冲池互斥访问,信号量empty和full分别表示空缓冲区的数量和满缓冲区的数量。又假定只要有空缓冲区,生产者就能将信息放入缓冲区,只要有满缓冲区,消费者就能将信息取出。
具体实现如下
1 int in = 0, out = 0; 2 item buffer[n]; 3 semaphore mutex=1, empty = n, full = 0; 4 5 void producer(){ 6 7 do{ 8 9 producer an item info; 10 wait(empty); 11 wait(mutex); 12 13 buffer[in]=info; 14 in = (in+1)%n 15 16 signal(mutex); 17 signal(full); 18 19 }while(true) 20 21 } 22 23 void consumer(){ 24 do{ 25 26 wait(full); 27 wait(mutex); 28 29 info=buffer[out]; 30 out = (out+1)%n; 31 32 signal(mutex); 33 signal(empty); 34 35 consumer the item in info; 36 37 }while(true) 38 } 39 40 int main() 41 { 42 producer();consumer(); 43 return 0; 44 }
标准红色的代码顺序不能交换,如果交换了可能导致死锁现象。假如生产者拿到访问权限mutex,但是缓冲区都满了,生产者陷入等待缓冲区中,而消费者由于拿不到访问权限,而在一直等待中,造成死锁。反之亦然

浙公网安备 33010602011771号