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*/
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() 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 }
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。