acl  3.5.3.0
acl::tbox< T > 模板类 参考

#include <tbox.hpp>

+ 类 acl::tbox< T > 继承关系图:
+ acl::tbox< T > 的协作图:

Public 成员函数

 tbox (bool free_obj=true)
 
 ~tbox (void)
 
void clear (bool free_obj=false)
 
bool push (T *t, bool notify_first=true)
 
T * pop (int wait_ms=-1, bool *found=NULL)
 
size_t size (void) const
 
void lock (void)
 
void unlock (void)
 

额外继承的成员函数

- Protected 成员函数 继承自 acl::acl::noncopyable
 noncopyable ()
 
 ~noncopyable ()
 

详细描述

template<typename T>
class acl::tbox< T >

用于线程之间的消息通信,通过线程条件变量及线程锁实现

示例:

class myobj { public: myobj(void) {} ~myobj(void) {}

void test(void) { printf("hello world\r\n"); } };

acl::tbox<myobj> tbox;

void thread_producer(void) { myobj* o = new myobj; tbox.push(o); }

void thread_consumer(void) { myobj* o = tbox.pop(); o->test(); delete o; }

在文件 tbox.hpp43 行定义.

构造及析构函数说明

◆ tbox()

template<typename T>
acl::tbox< T >::tbox ( bool  free_obj = true)
inline

构造方法

参数
free_obj{bool} 当 tbox 销毁时,是否自动检查并释放 未被消费的动态对象

在文件 tbox.hpp51 行定义.

52  : size_(0), free_obj_(free_obj), cond_(&lock_) {}

◆ ~tbox()

template<typename T>
acl::tbox< T >::~tbox ( void  )
inline

在文件 tbox.hpp54 行定义.

55  {
56  clear(free_obj_);
57  }
void clear(bool free_obj=false)
Definition: tbox.hpp:63

引用了 acl::tbox< T >::clear().

+ 函数调用图:

成员函数说明

◆ clear()

template<typename T>
void acl::tbox< T >::clear ( bool  free_obj = false)
inline

清理消息队列中未被消费的消息对象

参数
free_obj{bool} 释放调用 delete 方法删除消息对象

在文件 tbox.hpp63 行定义.

64  {
65  if (free_obj) {
66  for (typename std::list<T*>::iterator it =
67  tbox_.begin(); it != tbox_.end(); ++it) {
68 
69  delete *it;
70  }
71  }
72  tbox_.clear();
73  }

被这些函数引用 acl::tbox< T >::~tbox().

+ 这是这个函数的调用关系图:

◆ lock()

template<typename T>
void acl::tbox< T >::lock ( void  )
inline

在文件 tbox.hpp164 行定义.

165  {
166  if (lock_.lock() == false) {
167  abort();
168  }
169  }

引用了 acl::thread_mutex::lock().

+ 函数调用图:

◆ pop()

template<typename T>
T* acl::tbox< T >::pop ( int  wait_ms = -1,
bool *  found = NULL 
)
inline

接收消息对象

参数
wait_ms{int} >= 0 时设置等待超时时间(毫秒级别), 否则永远等待直到读到消息对象或出错
found{bool*} 非空时用来存放是否获得了一个消息对象,主要用在 当允许传递空对象时的检查
返回
{T*} 非 NULL 表示获得一个消息对象,返回 NULL 时得需要做进一 步检查,生产者如果 push 了一个空对象(NULL),则消费者也会获得 NULL, 但此时仍然认为获得了一个消息对象,只不过为空对象;如果 wait_ms 参数 为 -1 时返回 NULL 依然认为获得了一个空消息对象,如果 wait_ms 大于 等于 0 时返回 NULL,则应该检查 found 参数的值为 true 还是 false 来 判断是否获得了一个空消息对象

在文件 tbox.hpp122 行定义.

123  {
124  long long n = ((long long) wait_ms) * 1000;
125  bool found_flag;
126  if (lock_.lock() == false) {
127  abort();
128  }
129  while (true) {
130  T* t = peek(found_flag);
131  if (found_flag) {
132  if (lock_.unlock() == false) {
133  abort();
134  }
135  if (found) {
136  *found = found_flag;
137  }
138  return t;
139  }
140 
141  // 注意调用顺序,必须先调用 wait 再判断 wait_ms
142  if (!cond_.wait(n, true) && wait_ms >= 0) {
143  if (lock_.unlock() == false) {
144  abort();
145  }
146  if (found) {
147  *found = false;
148  }
149  return NULL;
150  }
151  }
152  }
bool wait(long long microseconds=-1, bool locked=false)
bool unlock(void)

引用了 acl::thread_mutex::lock(), acl::thread_mutex::unlock() , 以及 acl::thread_cond::wait().

+ 函数调用图:

◆ push()

template<typename T>
bool acl::tbox< T >::push ( T *  t,
bool  notify_first = true 
)
inline

发送消息对象

参数
t{T*} 非空消息对象
notify_first{bool} 如果为 true,则先通知后解锁,否则先解锁 后通知,注意二者的区别
返回
{bool}

在文件 tbox.hpp82 行定义.

83  {
84  if (lock_.lock() == false) {
85  abort();
86  }
87  tbox_.push_back(t);
88  size_++;
89 
90  if (notify_first) {
91  if (cond_.notify() == false) {
92  abort();
93  }
94  if (lock_.unlock() == false) {
95  abort();
96  }
97  } else {
98  if (lock_.unlock() == false) {
99  abort();
100  }
101  if (cond_.notify() == false) {
102  abort();
103  }
104  }
105 
106  return true;
107  }
bool unlock(void)
bool notify(void)

引用了 acl::thread_mutex::lock(), acl::thread_cond::notify() , 以及 acl::thread_mutex::unlock().

+ 函数调用图:

◆ size()

template<typename T>
size_t acl::tbox< T >::size ( void  ) const
inline

返回当前存在于消息队列中的消息数量

返回
{size_t}

在文件 tbox.hpp158 行定义.

159  {
160  return size_;
161  }

◆ unlock()

template<typename T>
void acl::tbox< T >::unlock ( void  )
inline

在文件 tbox.hpp171 行定义.

172  {
173  if (lock_.unlock() == false) {
174  abort();
175  }
176  }
bool unlock(void)

引用了 acl::thread_mutex::unlock().

+ 函数调用图:

该类的文档由以下文件生成: