@@ -104,14 +104,14 @@ int main() {
104
104
boost::asio::thread_pool pool{4}; // 创建一个包含 4 个线程的线程池
105
105
106
106
for (int i = 0; i < 10; ++i) {
107
- boost::asio::post(pool, [i]() { print_task(i); });
107
+ boost::asio::post(pool, [i] { print_task(i); });
108
108
}
109
109
110
110
pool.join(); // 等待所有任务执行完成
111
111
}
112
112
```
113
113
114
- > [运行](https://godbolt.org/z/h5G5hTT4a )测试。
114
+ > [运行](https://godbolt.org/z/Pa3z1oYej )测试。
115
115
116
116
- 创建线程池时,指定线程数量,线程池会创建对应数量的线程。
117
117
@@ -297,7 +297,7 @@ class ThreadPool {
297
297
- 用于线程间的同步,允许线程等待特定条件(如新任务加入队列)并在条件满足时唤醒线程。
298
298
299
299
3 . ** ` std::atomic<bool> stop_ ` **
300
- - 用于指示线程池是否停止接收新任务,并安全地通知所有工作线程退出 。
300
+ - 指示线程池是否停止 。
301
301
302
302
4 . ** ` std::atomic<std::size_t> num_threads_ ` **
303
303
- 表示线程池中的线程数量。
@@ -309,7 +309,22 @@ class ThreadPool {
309
309
310
310
- 线程容器,存储管理线程对象,每个线程从任务队列中获取任务并执行。
311
311
312
- 那么再直接提供构造函数以及添加任务到线程池的接口,然后内部再进行一点小小的操作,也就完成了:
312
+ ** 标头依赖** :
313
+
314
+ ``` cpp
315
+ #include < iostream>
316
+ #include < thread>
317
+ #include < mutex>
318
+ #include < condition_variable>
319
+ #include < future>
320
+ #include < atomic>
321
+ #include < queue>
322
+ #include < vector>
323
+ #include < syncstream>
324
+ #include < functional>
325
+ ```
326
+
327
+ 提供构造析构函数,以及一些外部接口:` submit() ` 、` start() ` 、` stop() ` 、` join() ` ,也就完成了:
313
328
314
329
``` cpp
315
330
inline std::size_t default_thread_pool_size ()noexcept {
@@ -330,7 +345,7 @@ public:
330
345
start();
331
346
}
332
347
333
- ~ThreadPool () {
348
+ ~ThreadPool (){
334
349
stop ();
335
350
join();
336
351
}
@@ -340,7 +355,7 @@ public:
340
355
cv_.notify_all();
341
356
}
342
357
343
- void join() {
358
+ void join(){
344
359
for (auto& thread : pool_) {
345
360
if (thread.joinable()) {
346
361
thread.join();
@@ -368,8 +383,8 @@ public:
368
383
return ret;
369
384
}
370
385
371
- void start() {
372
- for (std::size_t i = 0; i < num_threads_; ++i) {
386
+ void start(){
387
+ for (std::size_t i = 0; i < num_threads_; ++i){
373
388
pool_.emplace_back([this] {
374
389
while (!stop_) {
375
390
Task task;
@@ -383,7 +398,7 @@ public:
383
398
}
384
399
task ();
385
400
}
386
- });
401
+ });
387
402
}
388
403
}
389
404
@@ -397,74 +412,85 @@ private:
397
412
};
398
413
```
399
414
400
- ** 标头依赖** :
401
-
402
- ``` cpp
403
- #include < iostream>
404
- #include < thread>
405
- #include < mutex>
406
- #include < condition_variable>
407
- #include < future>
408
- #include < atomic>
409
- #include < queue>
410
- #include < vector>
411
- #include < syncstream>
412
- #include < functional>
413
- ```
414
-
415
415
** 测试 demo** :
416
416
417
417
``` cpp
418
- void print_task (int n) {
418
+ int print_task (int n) {
419
419
std::osyncstream{ std::cout } << "Task " << n << " is running." << std::endl;
420
+ return n;
420
421
}
421
- void print_task2(int n) {
422
+ int print_task2(int n) {
422
423
std::osyncstream{ std::cout } << "🐢🐢🐢 " << n << " 🐉🐉🐉" << std::endl;
424
+ return n;
423
425
}
424
426
425
427
int main() {
426
428
ThreadPool pool{ 4 }; // 创建一个有 4 个线程的线程池
429
+ std::vector< std::future<int > > futures; // future 集合,获取返回值
427
430
428
431
for (int i = 0; i < 10; ++i) {
429
- pool.submit(print_task, i);
432
+ futures.emplace_back( pool.submit(print_task, i) );
430
433
}
431
- pool.join(); // 确保执行完所有任务
434
+ pool.join();
432
435
433
436
std::puts("---------------------");
434
437
435
- pool.start(); // 重新启动线程池
438
+ pool.start();
436
439
437
440
for (int i = 0; i < 10; ++i) {
438
- pool.submit(print_task2, i);
441
+ futures.emplace_back( pool.submit(print_task2, i) );
439
442
}
440
- pool.join(); // 确保执行完所有任务
443
+ pool.join();
444
+
445
+ int sum = 0;
446
+ for(auto& future : futures){
447
+ sum += future.get();
448
+ }
449
+ std::cout << "sum: " << sum << '\n';
441
450
} // 析构自动 stop() join()
442
451
```
443
452
444
- **可能的[运行结果](https://godbolt.org/z/rM6vz1s9v )**:
453
+ **可能的[运行结果](https://godbolt.org/z/YT4ahh1Wz )**:
445
454
446
455
```shell
447
- Task 1 is running.
448
- Task 2 is running.
449
456
Task 0 is running.
450
- Task 3 is running.
451
457
Task 4 is running.
452
458
Task 5 is running.
453
459
Task 6 is running.
454
460
Task 7 is running.
455
461
Task 8 is running.
456
462
Task 9 is running.
463
+ Task 2 is running.
464
+ Task 3 is running.
465
+ Task 1 is running.
457
466
---------------------
458
467
🐢🐢🐢 0 🐉🐉🐉
459
- 🐢🐢🐢 2 🐉🐉🐉
460
468
🐢🐢🐢 1 🐉🐉🐉
469
+ 🐢🐢🐢 2 🐉🐉🐉
461
470
🐢🐢🐢 5 🐉🐉🐉
462
- 🐢🐢🐢 7 🐉🐉🐉
463
- 🐢🐢🐢 3 🐉🐉🐉
464
471
🐢🐢🐢 4 🐉🐉🐉
472
+ 🐢🐢🐢 3 🐉🐉🐉
465
473
🐢🐢🐢 6 🐉🐉🐉
474
+ 🐢🐢🐢 7 🐉🐉🐉
466
475
🐢🐢🐢 8 🐉🐉🐉
467
476
🐢🐢🐢 9 🐉🐉🐉
477
+ sum: 90
468
478
```
469
479
470
- 如果不自己显式调用 ` join() ` ,而是等待线程池析构调用,那么效果如同 ` asio::thread_pool ` ,会先进行 ` stop ` ,导致一些任务不执行。
480
+ > 如果不自己显式调用 ` join() ` ,而是等待线程池对象调用析构函数,那么效果如同 ` asio::thread_pool ` ,会先进行 ` stop ` ,导致一些任务不执行。
481
+
482
+ ** 构造函数和析构函数:**
483
+
484
+ - ** 构造函数** :初始化线程池并** 启动线程** 。
485
+
486
+ - ** 析构函数** :停止线程池并等待所有线程结束。
487
+
488
+ ** 外部接口:**
489
+
490
+ - ** ` stop() ` ** :停止线程池,通知所有线程退出(不会等待所有任务执行完毕)。
491
+
492
+ - ** ` join() ` ** :等待所有线程完成任务。
493
+
494
+ - ** ` submit() ` ** :将任务提交到任务队列,并返回一个` std::future ` 对象用于获取任务结果。
495
+
496
+ - ** ` start() ` ** :启动线程池,创建并启动指定数量的线程。
0 commit comments