FFmpeg 入门学习 04–生产者消费者模式

为使解码过程不会受到解封装过程进展的影响,解封装和解码一般并行操作,两者之间通过缓存数据进行交互。

FFmpeg 入门学习 04--生产者消费者模式

背景

生产者消费者模式

如下图所示:生产者在缓冲区未满时不断添加数据,并唤醒消费者进行数据读取;消费者在缓存区为空时阻塞等待生产者的唤醒,并在读取数据后唤醒等待的生产者以继续添加数据。

FFmpeg 入门学习 04--生产者消费者模式

std::condition_variable

在 C++ 中使用一个可调用对象构造一个 std::thread 对象,即可创建一个线程;使用互斥量 std::mutex 来确保多个线程对共享数据的读写操作的同步问题;使用 std::condition_variable 来解决线程执行顺序的同步问题。

生产者消费者模式的实现

使用 std::condition_variable 来实现生产者和消费者模式。

代码示例

class ProducerAndConsumerDemo
{
public:
    void producerNumber();//生产数据
    void consumerNumber();//消费数据
private:
    const int dataSize = 10;//总数据量
    queue<int> listBuffer;//数据缓存区
    const int bufferSize = 5;//缓存区大小
    condition_variable bufferCanRead;//信号量--可以读数据了
    condition_variable bufferCanWrite;//信号量--可以生产数据了
    mutex m_mutex;//互斥量
};
void ProducerAndConsumerDemo::producerNumber()
{
    for (int i = 0; i < dataSize; ++i)
    {
        {
            unique_lock<mutex> locker(m_mutex);
            bufferCanWrite.wait(locker, [&]() { return listBuffer.size() < bufferSize; });//缓存区满了则阻塞
            listBuffer.push(i);
            cout << "生产者---生产了数字:" << i << ",当前 bufferSize:" << listBuffer.size() << endl;
        }//解锁互斥量
        bufferCanRead.notify_one();//通知消费者队列不空了
        this_thread::sleep_for(chrono::milliseconds(10));//释放cpu占用
    }
}
void ProducerAndConsumerDemo::consumerNumber()
{
    while (true)
    {
        {
            unique_lock<mutex> locker(m_mutex);
            bufferCanRead.wait(locker, [&]() {return !listBuffer.empty(); });//缓冲区为空则阻塞
           
            int i = listBuffer.front(); listBuffer.pop();
            cout << "消费者---消费了数字:" << i << ",当前 bufferSize:" << listBuffer.size() << endl;
        }//解锁互斥量
        bufferCanWrite.notify_one();//通知生产者队列不满了
    }
}

运行示例

int main()
{
    ProducerAndConsumerDemo pcDemo;
    
    thread producerThread(&ProducerAndConsumerDemo::consumerNumber, &pcDemo);
    thread consumerThread(&ProducerAndConsumerDemo::producerNumber, &pcDemo);

    producerThread.join();
    consumerThread.join();

    system("pause");
    return 0;
}

运行结果如下:

FFmpeg 入门学习 04--生产者消费者模式

作者:litanyuan | 来源:公众号——编程猿来如此

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论