acl  3.5.3.0
thread_queue.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "noncopyable.hpp"
4 
5 struct ACL_AQUEUE;
6 
7 namespace acl
8 {
9 
11 {
12 public:
14  virtual ~thread_qitem() {}
15 };
16 
18 {
19 public:
20  thread_queue();
21  ~thread_queue();
22 
23  bool push(thread_qitem* item);
24  thread_qitem* pop(int wait_ms = -1);
25  int qlen() const;
26 
27 private:
28  ACL_AQUEUE* queue_;
29 };
30 
31 //////////////////////////////////////////////////////////////////////////////
32 
33 #if 0
34 
35 // internal functions being used
36 void* tbox_create(void);
37 void tbox_free(void*, void (*free_fn)(void*));
38 bool tbox_push(void*, void*);
39 void* tbox_pop(void*, int);
40 size_t tbox_size(void*);
41 
42 /**
43  * 用于线程之间的消息通信,通过线程条件变量及线程锁实现
44  *
45  * 示例:
46  *
47  * class myobj
48  * {
49  * public:
50  * myobj(void) {}
51  * ~myobj(void) {}
52  *
53  * void test(void) { printf("hello world\r\n"); }
54  * };
55  *
56  * acl::tbox<myobj> tbox;
57  *
58  * void thread_producer(void)
59  * {
60  * myobj* o = new myobj;
61  * tbox.push(o);
62  * }
63  *
64  * void thread_consumer(void)
65  * {
66  * myobj* o = tbox.pop();
67  * o->test();
68  * delete o;
69  * }
70  */
71 
72 template<typename T>
73 class tbox : noncopyable
74 {
75 public:
76  tbox(void)
77  {
78  tbox_ = tbox_create();
79  }
80 
81  ~tbox(void)
82  {
83  tbox_free(tbox_, tbox_free_fn);
84  }
85 
86  /**
87  * 发送消息对象
88  * @param t {T*} 非空消息对象
89  * @return {bool} 发送是否成功
90  */
91  bool push(T* t)
92  {
93  return tbox_push(tbox_, t);
94  }
95 
96  /**
97  * 接收消息对象
98  * @param wait_ms {int} >= 0 时设置读等待超时时间(毫秒级别),否则
99  * 永远等待直到读到消息对象或出错
100  * @return {T*} 非 NULL 表示获得一个消息对象
101  */
102  T* pop(int wait_ms = -1)
103  {
104  return (T*) tbox_pop(tbox_, wait_ms);
105  }
106 
107  /**
108  * 返回当前存在于消息队列中的消息数量
109  * @return {size_t}
110  */
111  size_t size(void) const
112  {
113  return tbox_size(tbox_);
114  }
115 
116 private:
117  void* tbox_;
118 
119  static void tbox_free_fn(void* o)
120  {
121  T* t = (T*) o;
122  delete t;
123  }
124 };
125 
126 #endif
127 
128 } // namespace acl
T * pop(int wait_ms=-1, bool *found=NULL)
Definition: tbox.hpp:122
struct ACL_AQUEUE ACL_AQUEUE
Definition: acl_aqueue.h:20
~tbox(void)
Definition: tbox.hpp:54
tbox(bool free_obj=true)
Definition: tbox.hpp:51
bool push(T *t, bool notify_first=true)
Definition: tbox.hpp:82
virtual ~thread_qitem()
#define ACL_CPP_API
size_t size(void) const
Definition: tbox.hpp:158