背景
最近在做视频播放器开发,学习了ffmpeg中自带播放器demo,里面的生产者消费者开发模式令我影响深刻,所以写一篇文章记录一下。
设计模型介绍
生产者消费者模式大致结构如下:
某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。
在实际开发中,由于生产数据和处理数据往往不在同一个线程或者进程,所以缓冲区的作用就体现出来。如果生产快了,那么就可以先把来不及消费的数据存储到缓冲区,达到缓冲上限就暂停生产,等消费者取出数据再开始生产。如果生产者的速度时快时慢,缓冲区还能起到稳定的作用,保证消费者获取数据稳定。
这种设计模式最大的好处就是支持忙闲不均。
生产者/消费者模型运用
下面我们再来说说在iOS中如何运用生产者/消费者模型。我们还是以视频播放器为例子。视频播放主要分为2部分,将文件解码成帧,再用帧显示在界面上。解码出帧这个过程我们看做是生产区,将帧显示在界面上,我们看做是消费区,而中间,我们开一个队列去存储帧,这个就是缓冲区。下面就是一个简单的视频播放器的核心思路。
看完设计思路,我们再来看看代码上的实现。缓冲区的队列会在不同的线程进行存储和取出,因此需要加锁保证线程安全。这里我们采用C中的pthread_cond和pthread_mutex进行实现。伪代码如下:
可能很多人对c的代码不熟悉,那么我们翻译成oc的锁和信号量来看这段代码:
demo
这里我写了一个比较简单的视频播放器设计代码,其中有上面所说的具体实现代码。地址:https://github.com/NBaby/Producer-and-consumer