File tree 1 file changed +11
-8
lines changed
1 file changed +11
-8
lines changed Original file line number Diff line number Diff line change @@ -86,7 +86,7 @@ graph TD
86
86
87
87
使用方法:
88
88
89
- 1 . 创建线程池对象,自行指定或者让 Asio 自动决定线程数量。
89
+ 1 . 创建线程池对象,指定或让 Asio 自动决定线程数量。
90
90
91
91
2 . 提交任务:通过 [ ` boost::asio::post ` ] ( https://beta.boost.org/doc/libs/1_82_0/doc/html/boost_asio/reference/post.html ) 函数模板提交任务到线程池中。
92
92
@@ -111,6 +111,9 @@ int main() {
111
111
}
112
112
```
113
113
114
+ > [运行](https://godbolt.org/z/h5G5hTT4a)测试。
115
+
116
+
114
117
- 创建线程池时,指定线程数量,线程池会创建对应数量的线程。
115
118
116
119
- 使用 `boost::asio::post` 提交任务,任务会被添加到任务队列中。
@@ -134,27 +137,27 @@ thread_pool::thread_pool()
134
137
num_threads_(detail::default_thread_pool_size())
135
138
```
136
139
137
- 代码很简单,就是 ` thread::hardware_concurrency() * 2 ` 而已,至于下面的判断是因为 ` std::thread::hardware_concurrency() ` 在某些特殊情况下可能返回 ` 0 ` , 例如硬件并发能力无法被检测时,那将 ` num_threads ` 设置为 2,确保线程池至少有 2 个线程。
140
+ 代码很简单,就是 ` thread::hardware_concurrency() * 2 ` 而已,至于下面的判断是因为 ` std::thread::hardware_concurrency() ` 在某些特殊情况下可能返回 ` 0 ` ( 例如硬件并发能力无法被检测时),那那将 ` num_threads ` 设置为 2,确保线程池至少有 2 个线程。
138
141
139
142
---
140
143
141
- 我们的重点来到它的析构函数中 :
144
+ Boost.Asio 的线程池对象在析构时会自动调用相关的清理方法,但你也可以手动进行控制 :
142
145
143
146
``` cpp
144
147
thread_pool::~thread_pool ()
145
148
{
146
- stop ();
147
- join ();
148
- shutdown ();
149
+ stop (); // 停止接收新任务
150
+ join (); // 等待所有线程完成
151
+ shutdown (); // 最终清理,释放资源
149
152
}
150
153
```
151
154
152
155
- ` stop ` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程。
153
-
154
156
- ` join() ` :等待所有线程完成它们的工作,确保所有线程都已终止。
155
-
156
157
- ` shutdown() ` :进行最终的清理,释放资源,确保线程池的完全清理和资源的正确释放
157
158
159
+ > 此处可阅读部分源码,帮助理解与记忆
160
+
158
161
## 实现线程池
159
162
160
163
实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。
You can’t perform that action at this time.
0 commit comments