Skip to content

Commit 9f61276

Browse files
committed
修改线程池中对 Boost.Asio.thread_pool 使用的描述与格式,增加测试链接。Mq-b#12
1 parent eeaac28 commit 9f61276

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

md/详细分析/04线程池.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ graph TD
8686
8787
使用方法:
8888

89-
1. 创建线程池对象,自行指定或者让 Asio 自动决定线程数量。
89+
1. 创建线程池对象,指定或让 Asio 自动决定线程数量。
9090

9191
2. 提交任务:通过 [`boost::asio::post`](https://beta.boost.org/doc/libs/1_82_0/doc/html/boost_asio/reference/post.html) 函数模板提交任务到线程池中。
9292

@@ -111,6 +111,9 @@ int main() {
111111
}
112112
```
113113
114+
> [运行](https://godbolt.org/z/h5G5hTT4a)测试。
115+
116+
114117
- 创建线程池时,指定线程数量,线程池会创建对应数量的线程。
115118
116119
- 使用 `boost::asio::post` 提交任务,任务会被添加到任务队列中。
@@ -134,27 +137,27 @@ thread_pool::thread_pool()
134137
num_threads_(detail::default_thread_pool_size())
135138
```
136139

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 个线程。
138141

139142
---
140143

141-
我们的重点来到它的析构函数中
144+
Boost.Asio 的线程池对象在析构时会自动调用相关的清理方法,但你也可以手动进行控制
142145

143146
```cpp
144147
thread_pool::~thread_pool()
145148
{
146-
stop();
147-
join();
148-
shutdown();
149+
stop(); // 停止接收新任务
150+
join(); // 等待所有线程完成
151+
shutdown(); // 最终清理,释放资源
149152
}
150153
```
151154

152155
- `stop` :修改内部的标志位存在使得线程池能够识别何时需要停止接收新的任务,然后唤醒所有线程。
153-
154156
- `join()` :等待所有线程完成它们的工作,确保所有线程都已终止。
155-
156157
- `shutdown()` :进行最终的清理,释放资源,确保线程池的完全清理和资源的正确释放
157158

159+
> 此处可阅读部分源码,帮助理解与记忆
160+
158161
## 实现线程池
159162

160163
实现一个普通的能够满足日常开发需求的线程池实际上非常简单,也只需要一百多行代码。

0 commit comments

Comments
 (0)