acl  3.5.3.0
thread.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "noncopyable.hpp"
4 
5 namespace acl
6 {
7 
8 /**
9  * 纯虚函数:线程任务类,该类实例的 run 方法是在子线程中被执行的
10  */
12 {
13 public:
14  thread_job(void) {}
15  virtual ~thread_job(void) {}
16 
17  /**
18  * 纯虚函数,子类必须实现此函数,该函数在子线程中执行
19  * @return {void*} 线程退出前返回的参数
20  */
21  virtual void* run(void) = 0;
22 
23  /**
24  * 虚方法,在新创建的子线程中的 run() 方法被调用前调用,在同步创建
25  * 线程方式下,子线程被创建后调用该虚方法,然后再通知创建这线程,
26  * 从而保证在创建线程的 start() 方法返回前子线程执行初始化过程。
27  */
28  virtual void init(void) {}
29 };
30 
31 template<typename T> class tbox;
32 class atomic_long;
33 
34 /**
35  * 线程纯虚类,该类的接口定义类似于 Java 的接口定义,子类需要实现
36  * 基类的纯虚函数,使用者通过调用 thread::start() 启动线程过程
37  */
39 {
40 public:
41  thread(void);
42  virtual ~thread(void);
43 
44  /**
45  * 开始启动线程过程,一旦该函数被调用,则会立即启动一个新的
46  * 子线程,在子线程中执行基类 thread_job::run 过程
47  * @return {bool} 是否成功创建线程
48  */
49  bool start(bool sync = false);
50 
51  /**
52  * 当创建线程时为非 detachable 状态,则必须调用此函数等待线程结束;
53  * 若创建线程时为 detachable 状态时,禁止调用本函数
54  * @param out {void**} 当该参数非空指针时,该参数用来存放
55  * 线程退出前返回的参数
56  * @return {bool} 是否成功
57  */
58  bool wait(void** out = NULL);
59 
60  /**
61  * 在调用 start 前调用此函数可以设置所创建线程是否为分离 (detachable)
62  * 状态;如果未调用此函数,则所创建的线程默认为非分离状态,在非分离状
63  * 态下,其它线程可以 wait 本线程对象,否则禁止 wait 本线程对象;在非
64  * 分离状态下,其它线程必须要 wait 本线程,否则会引起内存泄露。
65  * @param yes {bool} 是否为分离状态
66  * @return {thread&}
67  */
68  thread& set_detachable(bool yes);
69 
70  /**
71  * 在调用 start 前调用此函数可以设置所创建线程的堆栈大小
72  * @param size {size_t} 线程堆栈大小,当该值为 0 或未
73  * 调用此函数,则所创建的线程堆栈大小为系统的默认值
74  * @return {thread&}
75  */
76  thread& set_stacksize(size_t size);
77 
78  /**
79  * 在调用 start 后调用此函数可以获得所创建线程的 id 号
80  * @return {unsigned long}
81  */
82  unsigned long thread_id(void) const;
83 
84  /**
85  * 当前调用者所在线程的线程 id 号
86  * @return {unsigned long}
87  */
88  static unsigned long thread_self(void);
89  static unsigned long self(void)
90  {
91  return thread_self();
92  }
93 
94 private:
95  bool detachable_;
96  size_t stack_size_;
97 #if defined(_WIN32) || defined(_WIN64)
98  void* thread_;
99  unsigned long thread_id_;
100 #else
101  pthread_t thread_;
102  unsigned long thread_id_;
103 #endif
104  tbox<int>* sync_;
105  atomic_long* lock_;
106 
107  void* return_arg_;
108  static void* thread_run(void* arg);
109 
110  void wait_for_running(void);
111 };
112 
113 } // namespace acl
thread_job(void)
Definition: thread.hpp:14
virtual void init(void)
Definition: thread.hpp:28
#define ACL_CPP_API
virtual ~thread_job(void)
Definition: thread.hpp:15