acl  3.5.3.0
mbox.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <assert.h>
4 #include "noncopyable.hpp"
5 
6 namespace acl
7 {
8 
9 // internal functions being used
10 void* mbox_create(bool mpsc);
11 void mbox_free(void*, void (*free_fn)(void*));
12 bool mbox_send(void*, void*);
13 void* mbox_read(void*, int, bool*);
14 size_t mbox_nsend(void*);
15 size_t mbox_nread(void*);
16 
17 /**
18  * 可用于在线程之间、协程之间进行通信的类,内部实现采用无锁队列 + IO 通信相
19  * 结合方式实现
20  *
21  * 示例:
22  *
23  * class myobj
24  * {
25  * public:
26  * myobj(void) {}
27  * ~myobj(void) {}
28  *
29  * void run(void)
30  * {
31  * printf("hello world!\r\n");
32  * }
33  * };
34  *
35  * acl::mbox<myobj> mbox;
36  *
37  * void thread_producer(void)
38  * {
39  * myobj* o = new myobj;
40  * mbox.push(o);
41  * }
42  *
43  * void thread_consumer(void)
44  * {
45  * myobj* o = mbox.pop();
46  * o->run();
47  * delete o;
48  * }
49  */
50 
51 template<typename T>
52 class mbox : public noncopyable
53 {
54 public:
55  /**
56  * 构造方法
57  * @param free_obj {bool} 当 tbox 销毁时,是否自动检查并释放
58  * 未被消费的动态对象
59  * @param mpsc {bool} 是否为多生产者-单消费者模式
60  */
61  mbox(bool free_obj = true, bool mpsc = true)
62  : free_obj_(free_obj)
63  {
64  mbox_ = mbox_create(mpsc);
65  assert(mbox_);
66  }
67 
68  ~mbox(void)
69  {
70  mbox_free(mbox_, free_obj_ ? mbox_free_fn : NULL);
71  }
72 
73  /**
74  * 发送消息对象
75  * @param t {T*} 非空消息对象
76  * @param dummy {bool} 目前无任何用处,仅是为了与 tbox 接口一致
77  * @return {bool} 发送是否成功
78  */
79  bool push(T* t, bool dummy = false)
80  {
81  (void) dummy;
82  return mbox_send(mbox_, t);
83  }
84 
85  /**
86  * 接收消息对象
87  * @param timeout {int} >= 0 时设置读等待超时时间(毫秒级别),否则
88  * 永远等待直到读到消息对象或出错
89  * @param success {bool*} 可以用于辅助确定读操作是否成功
90  * @return {T*} 非 NULL 表示读到一个消息对象,为 NULL 时,还需通过
91  * success 参数的返回值检查操作是否成功
92  */
93  T* pop(int timeout = -1, bool* success = NULL)
94  {
95  return (T*) mbox_read(mbox_, timeout, success);
96  }
97 
98  /**
99  * 统计当前已经发送的消息数
100  * @return {size_t}
101  */
102  size_t push_count(void) const
103  {
104  return mbox_nsend(mbox_);
105  }
106 
107  /**
108  * 统计当前已经接收到的消息数
109  * @return {size_t}
110  */
111  size_t pop_count(void) const
112  {
113  return mbox_nread(mbox_);
114  }
115 
116 private:
117  void* mbox_;
118  bool free_obj_;
119 
120  static void mbox_free_fn(void* o)
121  {
122  T* t = (T*) o;
123  delete t;
124  }
125 };
126 
127 } // namespace acl
void * mbox_create(bool mpsc)
size_t pop_count(void) const
Definition: mbox.hpp:111
~mbox(void)
Definition: mbox.hpp:68
size_t mbox_nsend(void *)
bool mbox_send(void *, void *)
mbox(bool free_obj=true, bool mpsc=true)
Definition: mbox.hpp:61
void * mbox_read(void *, int, bool *)
void mbox_free(void *, void(*free_fn)(void *))
T * pop(int timeout=-1, bool *success=NULL)
Definition: mbox.hpp:93
bool push(T *t, bool dummy=false)
Definition: mbox.hpp:79
size_t mbox_nread(void *)
size_t push_count(void) const
Definition: mbox.hpp:102