码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2014-10-07 19:02:13      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   sp   div   

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

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

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

Buffer的声明如下:

bubuko.com,布布扣
 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实现代码如下:

bubuko.com,布布扣
 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

 

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

标签:style   blog   http   color   io   os   ar   sp   div   

原文地址:http://www.cnblogs.com/gjn135120/p/4009428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!