Linux组件封装(四) Buffer的封装

这里,我们需要将缓冲区封装起来,然后让缓冲区与线程想连接,所以我们需要一个相应的接口。

在Buffer中,我们需要想对应的一把锁与两个条件变量。

当满足队列为空时,消费者等待,反之,生产者等待。

Buffer的声明如下:

 1 #ifndef BUFFER_H
 2 #define BUFFER_H
 3
 4 #include "NonCopyable.h"
 5 #include "MutexLock.h"
 6 #include "Condition.h"
 7 #include <queue>
 8
 9
10
11 class Buffer : private NonCopyable
12 {
13 public:
14
15     Buffer(size_t queueSize);
16
17     void push(int val);
18     int pop();
19
20     bool empty() const;
21     size_t size() const;
22
23 private:
24
25     mutable MutexLock _mutex;
26     Condition _full;
27     Condition _empty;
28     size_t _queueSize;
29     std::queue<int> _queue;
30 };
31
32
33 #endif  /*BUFFER_H*/

在这里,我们引用MutexLockGuard来解决忘记解锁的问题,当我们定义一个该类的对象时,·自动上锁,
当该对象销毁时,自动解锁。

然后实现相应的进入队列和弹出队列等。

cpp实现代码如下:

 1 #include "Buffer.h"
 2 #include "Thread.h"
 3 using namespace std;
 4
 5 Buffer::Buffer(size_t queueSize)
 6     :_full(_mutex),
 7      _empty(_mutex),
 8      _queueSize(queueSize)
 9 {
10
11 }
12
13 bool Buffer::empty() const
14 {
15     MutexLockGuard lock(_mutex);
16     return _queue.empty();
17 }
18
19 size_t Buffer::size() const
20 {
21     MutexLockGuard lock(_mutex);
22     return _queue.size();
23 }
24
25 void Buffer::push(int val)
26 {
27     {
28         MutexLockGuard lock(_mutex);
29         while(_queue.size() > _queueSize)
30             _empty.wait();
31         _queue.push(val);
32     }
33     _full.notify();
34 }
35
36 int Buffer::pop()
37 {
38     int tmp = 0;
39     {
40         MutexLockGuard lock(_mutex);
41         while(_queue.empty())
42             _full.wait();
43         tmp = _queue.front();
44         _queue.pop();
45     }
46     _empty.notify();
47     return tmp;
48 }

时间: 2024-08-09 03:01:32

Linux组件封装(四) Buffer的封装的相关文章

Linux组件封装之五:生产者消费者问题

生产者,消费者问题是有关互斥锁(MutexLock).条件变量(Condition).线程(Thread)的经典案例: 描述的问题可以叙述为 生产者往buffer中投放产品,而消费者则从buffer中消费产品. 生产着消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区投放或者消费产品,这个buffer就是所谓的临界资源. 生产者往缓冲区中投放产品时,如果缓冲区已满,那么该线程需要等待,即进入阻塞状态,一直到消费者取走产品为止. 相应的,消费者欲取走产品,如果此时缓冲区为

Linux组件封装(五)一个生产者消费者问题示例

生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次只允许一个线程进入缓冲区,它就是所谓的临界资源. 生产者往缓冲区放物品时,如果缓冲区已满,那么需要等待,一直到消费者取走产品为止. 消费者取走产品时,如果没有物品,需要等待,一直到有生产者放入为止. 第一个问题属于互斥问题,我们需要使用一把互斥锁,来实现对缓冲区的安全访问. 后两个属于同步问题,两类

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传)

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传) 背景 断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全! 效果 实现 下载和之前的http请求可以相互独立,所以我们单独给download建立一个工程moudel处理 1.创建service接口 和以前一样,先写接口 注意:Streaming是判断是否写入内存的标示,如果小文件可以

嵌入式linux C++语言(三)——封装(Encapsulation)

嵌入式linux C++语言(三)--封装(Encapsulation) 一.封装简介 C语言等面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体:在C++等面向对象编程中,数据以及数据的相关操作被设计为对象,对象包括属性(数据)和操作(函数),两者共同构成对象实体(即类实体).面向对象编程使程序更模块化,更易读易写,提升了代码重用到一个更高的层次. 面向对象编程中,数据和数据的操作封装为了对象.封装可以隐藏实现细节,使得代码模块化,是把过程和数据包围起来,对数据的访问只能通过已定义的

关于linux上cron服务的python封装工具

关于cron:定时任务服务,一般linux自带且已启动.(pgrep cron查看cron服务是否启动了.) 关于plan:一个通过python来定制cron服务的工具.其官网:http://plan.readthedocs.org/ plan的使用例子: 例子1: from plan import Plan cron = Plan() output = dict(stdout='~/stdout.log', stderr='~/stderr.log') cron.command('date',

linux基础命令作业四

linux基础命令四 作业一: 1)              开启Linux系统前添加一块大小为15G的SCSI硬盘 2)              开启系统,右击桌面,打开终端 3)              为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区, 在扩展分区上划分1个逻辑分区,大小为5G 4)              格式化主分区为ext3系统 5)              将逻辑分区设置为交换分区 6)              启用上一步的交换分区 7)   

Linux LCD驱动(四)--驱动的实现

目录(?)[-] 基本原理 写 framebuffer 驱动程序要做什么 LCD 模块 驱动程序 控制器 什么是 frame buffer 设备 Linux Frame Buffer 驱动程序层次结构 数据结构 接口 一个 LCD controller 驱动程序 分配系统内存作为显存 实现 fb_ops 结构 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来: 驱动程序分配系统内存作为显存:实现

自学Linux命令的四种方法

自学Linux命令的四种方法 导读 童鞋们刚接触linux时,在学习过程中中会遇到不少问题,学习linux摸不着头脑,那么下面介绍四种linux的学习方法,特别适合新手. 方法一:终端"每日提示" 在.bashrc中(/home/.bashrc)增加如下一行: echo "Did you know that:"; whatis$(ls /bin | shuf -n 1) 你只需要增加这行就够了!如果你想让它更娱乐化一些,你可以安装cowsay.Ubuntu/Debi

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma