当前位置: 首页 > news >正文

【c++】手撕单例模式线程池

文章目录

  • C++线程池实现
    • 项目概述
    • 核心特性
      • 1. 单例模式设计
      • 2. 禁止拷贝与赋值
      • 3. 固定线程池大小
      • 4. 高效的任务队列
    • 技术亮点
      • 移动语义优化
      • 条件变量的正确使用
      • 优雅的退出机制
      • 万能引用与完美转发
    • 使用示例
    • 技术栈

C++线程池实现

源码地址:https://github.com/1024freedom/thread_learn/tree/master

项目概述

这是一个轻量级的C++线程池实现,用于学习和理解多线程编程的核心概念。项目通过单例模式实现了一个可复用的线程池,支持任意类型任务的并发执行。

核心特性

1. 单例模式设计

线程池采用了单例模式,确保整个程序中只有一个线程池实例。通过静态局部变量实现了线程安全的懒汉式单例。 1

2. 禁止拷贝与赋值

为了防止误用,线程池显式禁用了拷贝构造函数和赋值运算符,这是管理资源类的最佳实践。 2

3. 固定线程池大小

默认创建10个工作线程,所有线程在构造时就已创建并开始等待任务。 3

4. 高效的任务队列

使用std::queue存储待执行任务,配合互斥锁和条件变量实现线程安全的生产者-消费者模式。 4

技术亮点

移动语义优化

在构造线程时使用了emplace_back而非push_back,直接在容器内存中构造对象,避免了额外的拷贝/移动操作。 5

任务出队时也使用了移动语义,提高了性能: 6

条件变量的正确使用

工作线程通过条件变量等待任务,避免了忙等待:

  • 当任务队列为空且未停止时,线程进入等待状态
  • 当有新任务入队或线程池停止时,线程被唤醒 7

优雅的退出机制

析构函数确保所有任务执行完毕后才退出:

  1. 设置停止标志
  2. 唤醒所有等待的线程
  3. 等待所有线程执行完毕 8

工作线程在检测到停止标志且任务队列为空时才会退出: 9

万能引用与完美转发

enqueue方法使用了模板和可变参数,支持任意类型的可调用对象和参数。通过std::forward实现完美转发,保持参数的值类别(左值/右值)。 10

使用示例

主函数展示了基本用法:向线程池提交10个任务,每个任务打印信息、休眠1秒后完成。 11

技术栈

  • C++11标准特性
    • std::thread - 线程管理
    • std::mutex - 互斥锁
    • std::condition_variable - 条件变量
    • std::function - 函数包装器
    • Lambda表达式
    • 移动语义
    • 可变参数模板
http://www.dtcms.com/a/596754.html

相关文章:

  • DNS主从服务器练习
  • 云游戏平台前端技术方案
  • 当前MySQL端口: 33060,可被任意服务器访问,这可能导致MySQL被暴力破解,存在安全隐患
  • Android开发-java版学习笔记第四天
  • C#WEB 防重复提交控制
  • Linux:systemd服务之.service文件(二)
  • 24_FastMCP 2.x 中文文档之FastMCP服务端认证:构建完整的 OAuth 服务器详解
  • Linux:认识Systemd服务(一)
  • Python编程实战 - Python实用工具与库 - 爬取并存储网页数据
  • 网站建设中字样图片wordpress首页调用文章数量
  • “基于‘多模态SCA+全周期协同’的中间件开源风险治理实践”荣获OSCAR开源+安全及风险治理案例
  • BetterDisplay Pro for Mac显示器增强工具
  • 解决huggingface下载仓库时有部分大文件不能下载的问题
  • Qt键盘组合
  • Qt中的QShortcut:高效键盘快捷方式开发指南
  • c mvc制作网站开发google谷歌
  • STM32F103RCT6+STM32CubeMX+keil5(MDK-ARM)+Flymcu完成轮询方式检测按键
  • paimon实战 -- Flink 写入 Paimon 流程深度解析
  • HOT100题打卡第35天——二分查找
  • R语言 | 带重要性相关热图和贡献图如何解释?如何绘制随机森林计算结果重要性及相关性图?[学习笔记]
  • 做 专而精 的网站网站建设个人主要事迹
  • 怎么查看一个网站是谁做的注册城乡规划师备考
  • CMake开源库的编译与使用
  • GitLab CI/CD和Arbess,开源免费CI/CD工具选型指南
  • Observability:适用于 PHP 的 OpenTelemetry:EDOT PHP 加入 OpenTelemetry 项目
  • 第二十七篇:C++20协程:异步编程的终极革命
  • 【后端】【面试】 ③ PostgreSQL高级面试题(含答案与实战案例)
  • 静态加载法
  • 规范使用指针
  • 工业实时数据库选型指南:深度解析紫金桥 vs TDengine