生产者和消费者问题

  生产者和消费者问题

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

 

分析问题:生产者和消费者共享同一个缓冲池,同时访问是可能会发生数据的不准确型。同一时间允许一个进程进行访问,即可解决问题。

 

  1. 利用记录型信号量解决问题

    假设共享的缓冲池中有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,但是缓冲区都满了,生产者陷入等待缓冲区中,而消费者由于拿不到访问权限,而在一直等待中,造成死锁。反之亦然

    

posted @ 2020-03-31 16:45  快乐的小笨猪  阅读(697)  评论(0)    收藏  举报