首页 > 代码库 > 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*/
View Code

在这里,我们引用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 }
View Code

 

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