生产者消费者问题有很多种情况,比如1:1,1:N,N:1,N:M

一. 模型1

生产者进程(){

         pthread_mutex_lock(&lock);

         生产产品;

         pthread_cond_signal(&notempty);

         pthread_mutex_unlock(&lock);

}

 

消费者进程(){

         pthread_mutex_lock(&lock);

         if (没有产品)

                  pthread_cond_wait(&notempty);

         消费产品

         pthread_mutex_unlock(&lock);

}

模型1比较简单,并且存在一定的问题。

① 如果生产者进程先运行,那么此时没有消费者等待,但是生产者在生产出一个产品之后发出一个信号,

此时没有消费者接收信号,也就是信号丢失,便无法正常运行。

② 对于N:M的模型,还需要考虑生产者以及消费者对于临界区的互斥访问。如消费者被唤醒之后,资源是否

被其他消费者正在消费。

③在多核处理器中,生产者生产力一个产品,并且发送一个信号,可能被多个消费者接受,从而可能出现同时多个进程被唤醒,但是只有一个产品而有多个消费者被唤醒,所以有一些消费者即使被唤醒也没有产品被消费,这就出现了错误。(这被称为 虚假唤醒)

 

二.模型2

这个模型主要解决生产者,消费者互斥的问题和 虚假唤醒。

 

1.如何解决的互斥问题呢?

在生产的时候,对生产者进行加锁解锁,这样就可以防止出现临界区被多个生产者或者消费者同时访问的情况。

消费者也是如此解决。

 

 

2.虚假唤醒怎么解决的呢?

虚假唤醒的解决方案其实只是把 if (是否满足条件) 改成 while (是否满足条件)

为什么这样就可以解决问题呢? 因为当一个生产者发出一个信号的时候,多个消费者同时接收信号,

这样他们被唤醒之后,还要进行一个循环,如果有一个进程已经开始消费这个产品(对这个产品加锁)

那么他们的判断的条件将是不满足,就会继续等待,而不是上面出现的同时去消费这个产品。

 

直接看代码就行啦(在Linux下执行)

 

 

 

 

ping命令的实现

1.ping 的原理   ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它...

阅读全文

初探Stack & Heap

之前一直对 栈/堆 有所听闻,但是并没有深入理解。 在ACM训练的时候,只知道递归层数如果很多可能导致爆栈(栈的大小最初的时候是固定的)。 今天再次看到栈...

阅读全文

1 条评论

欢迎留言

*