首页 > 代码库 > Linux组件封装(四) Buffer的封装
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 NonCopyable12 {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() const14 {15 MutexLockGuard lock(_mutex);16 return _queue.empty();17 }18 19 size_t Buffer::size() const20 {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 }
Linux组件封装(四) Buffer的封装
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。