线程池详解(c++手撕线程池)

线程池是管理线程的容器,核心作用是复用线程、控制并发数、降低资源消耗,是并发编程中优化性能的常用工具。

代码仓库: Thread_pool: 线程池是管理线程的容器,核心作用是复用线程、控制并发数、降低资源消耗,是并发编程中优化性能的常用工具。

核心思路 :

  • 提前创建出一批线程,避免线程频繁创建/销毁的开销。
  • 把任务储存再任务队列中,线程不断地从任务队列取任务执行,队列为空时进入休眠
  • 提供添加任务接口,隐藏了执行任务地细节。
  • 使用条件变量和CAS锁把对线程地唤醒和对任务队列地操作解耦,避免线程无意义地休眠。

核心成员:

  • 工作线程 : 提前创建地一批线程 。
  • 任务队列 : 存储任务

使用方法:

1.把 ThreadPool.h 文件加入项目中
2.创建 Thread_pool 对象,推荐使用智能指针
c++ 复制代码
    std::unique_ptr<Thread_pool> thread_pool = std::make_unique<Thread_pool>();
3.初始化工作线程 参数为线程数 默认为4线程
c++ 复制代码
    thread_pool->start_work();
4.添加任务
  • 参数

    • func 待执行的任务主体
    • args... 待执行任务 func 所需的参数列表,支持任意数量、任意类型的参数
  • 返回值

    • std::future 可异步获得运行结果 future.get() 阻塞等待任务完成并获取结果(若 func 返回 void,则 get() 仅等待任务完成),或通过 future.wait() 仅阻塞等待任务完成,不获取结果。
c++ 复制代码
    auto add = [](int a, int b) {
        return a + b;
        };
    auto fut =  thread_pool->submit(add, 1, 2);
    std::cout << fut.get() << std::endl;
5.停止线程池
c++ 复制代码
thread_pool->stop_work();
6.阻塞主线程
c++ 复制代码
thread_pool->join();

简单示例:

复制代码
#include "ThreadPool.h"
#include <iostream>
#include <vector>
std::mutex mtx;
int main() {
    std::unique_ptr<Thread_pool> thread_pool = std::make_unique<Thread_pool>();
    thread_pool->start_work();
    auto print_thread = []() {
        std::unique_lock<std::mutex>lock(mtx);
        std::cout << std::this_thread::get_id() << std::endl;
        };
    for (int i = 0; i < 100; ++i) {
        thread_pool->submit(print_thread);
    }
    thread_pool->stop_work();
    thread_pool->join();
    return 0;
}

test压力测试结果:

相关推荐
charlie114514191几秒前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
liu****4 分钟前
第十五届蓝桥杯大赛软件赛国赛C/C++大学B组
c++·算法·蓝桥杯·acm
zhooyu4 分钟前
利用叉乘判断OpenGL中的左右关系
c++·3d·opengl
光电笑映21 分钟前
C++11 新特性全解:语法糖、容器进化与可调用对象包装
开发语言·c++
SWAGGY..34 分钟前
【C++初阶】:(7)STL简介
开发语言·c++
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 279. 完全平方数 | C++ 动态规划 (完全背包)
c++·leetcode·动态规划
H Journey1 小时前
C++ 11 新特性 统一初始化与与 std::initializer_list
c++·列表初始化
木子墨5161 小时前
LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III
数据结构·c++·算法·leetcode·动态规划·力扣
li1670902701 小时前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
‎ദ്ദിᵔ.˛.ᵔ₎1 小时前
仿函数使用
c++