C++11 新接口 实现线程池类

C++异步编程方案深度对比:从线程池到协程的实战选型指南 异步处理是现代高并发系统的核心技术,其核心思想是在等待I/O操作时不阻塞CPU,从而提升系统吞吐量和资源利用率。其实现原理主要围绕事件驱动模型,通过回调、Future/Promise或协程等机制,在I/O就绪时通知程序继续执行。这项技术的核心价值在于能够以少量线程支撑海量并发连接,是构建高性能网络服务器、游戏后端、金融交易系统等I/O密集型服务的基石。在实际应用场景中,开发者需要根据任务类型(CPU密集型或I/O密集型)、性能要求及团队技术栈,在多种方案中做出选择。本文聚焦于C++生态,系统性地横向对比了包 阅读详情
class Job
{
protected:
	int i;
public:
	Job(int c) :i(c) {}
	virtual void doJob() { printf("job : %d\n", i);}
};

class ThreadPool
{
	vector<thread*> pool;
public:	
	ThreadPool(int n):close(false), max_num(n)
	{
		start();
	}

	void start()
	{
		for (int i = 0; i < max_num; ++i)
			pool.push_back(new thread(&ThreadPool::run, this));
	}

	void run()
	{
		while (true)
		{
			unique_lock<mutex> lk(m_lock);
			while (que.empty() && !close)
				cond.wait(lk, [this]() {return !(this->que.empty() || this->close);});
			if (close)
				break;
			shared_ptr<Job> job = que.front();
			que.pop();
			lk.unlock();
			job->doJob();
		}
	}

	void addJob(shared_ptr<Job> job)
	{
		lock_guard<mutex> lk(m_lock);
		que.push(job);
		cond.notify_one();
	}

	void finish()
	{
		close = true;
		cond.notify_all();
		for (int i = 0; i < max_num; ++i)
		{
			pool[i]->join();
		}
	}
	
	bool empty()
	{
		return que.empty();
	}

	~ThreadPool()
	{
		for (int i = 0; i < max_num; ++i)
			delete pool[i];
	}

	queue<shared_ptr<Job>> que;
	mutex m_lock;
	condition_variable cond;
	int max_num;
	bool close;
};

需要完成什么工作,只需要在类Job 的基础上派生子类,并重写虚函数接口doJob即可。如下例子:

class AJob : public Job
{
public:
	AJob(int c):Job(c){}

	void doJob()
	{
		printf("AJob : %d\n", Job::i);
	}
};

class BJob : public Job
{
public:
	BJob(int c):Job(c){}

	void doJob()
	{
		printf("BJob : %d\n", Job::i);
	}
};


int main()
{
	ThreadPool t(4);
	for (int i = 0; i < 11; ++i)
	{
		if (i % 2)
		{
			shared_ptr<Job> job(new AJob(i));
			t.addJob(job);
		}
		else
		{
			shared_ptr<Job> job(new BJob(i));
			t.addJob(job);

		}
	}
	while (!t.empty());
	t.finish();
}



从游戏报错到高性能计算:深入解析Intel TBB并行编程库 并行计算是现代软件开发中提升程序性能的核心技术,它通过将任务分解到多个处理器核心上同时执行,充分利用多核硬件资源。其基本原理包括任务并行与数据并行两种范式,旨在解决传统单线程程序在计算密集型场景下的性能瓶颈。这项技术的核心价值在于显著提升计算效率、改善资源利用率,并降低开发者手动管理线程的复杂度。在实际应用中,并行计算广泛用于游戏引擎、科学模拟、数据分析和高频交易等高性能计算场景。本文以Intel Threading Building Blocks(TBB)这一工业级C++并行编程库为例,深入探讨其任务调度 阅读详情

相关推荐

Android AIDL后端语言深度解析:Java、C++、NDK与Rust选型与实战

跨进程通信(IPC)是构建复杂、模块化软件系统的核心技术,它允许不同进程间安全、高效地交换数据和调用服务。Android系统通过Binder机制实现了高效的IPC,而Android接口定义语言(AIDL)则是定义Binder通信接口的标准化工具,它通过生成桩代码(Stub Code)来封装底层的序列化与通信细节,极大地简化了开发。理解AIDL的不同后端语言(Backend)选择,对于构建高性能、高稳定性的系统服务与硬件抽象层(HAL)至关重要。Java后端生态成熟,适用于大部分应用层开发;C++(CPP)后

weixin_33805992的博客 313

C++ 11线程池

一、基本概念 1.1 为什么要用线程池 创建/销毁线程伴随着系统开销,过于频繁的创建和销毁线程会影响程序的处理效率: 如创建线程消耗时间为T1,执行任务消耗时间为T2,销毁线程消耗时间为T3,若T1+T3 > T2 ,则开启一个线程执行该任务不划算。 1.2 线程池的基本思想 因为程序边运行边创建线程是比较耗时的,所以我们通过池化的思想:在程序开始运行前创建多个线程,这样,程序在运行时,只需要从线程池中拿来用就可以了.大大提高了程序运行效率。 参考文献: https://b...

灰太狼的小秘密 8077

第 18 章:ART 运行时

Android运行时(ART)是Android应用的执行环境,负责加载和执行DEX字节码。ART通过多层级编译策略(解释器、JIT、AOT)和并发垃圾回收(如CC和CMC收集器)优化性能。关键组件包括类链接器、dex2oat编译器、JIT编译器和内存管理系统。ART支持模块化更新,并通过配置文件引导优化(PGO)提升应用性能。调试能力基于JVMTI,提供断点、类重定义等功能。Android 17引入了多项改进,如分代标记-压缩GC、禁止反射修改static final字段、DEX容器格式V41等。ART架构

dengfuma的专栏 283

转载一份C++线程池的代码,非常实用

#ifndef _ThreadPool_H_#define _ThreadPool_H_#pragma warning(disable: 4530)#pragma warning(disable: 4786)#include #include #include #include using namespace std;class ThreadJob  //工作基类{public:  //供线程池调

revv的专栏 3万+

25、深入理解 Pthreads 线程编程

本文深入探讨了 Pthreads 线程编程的核心概念和实践技巧,涵盖了线程的创建与终止、线程同步机制、互斥锁和条件变量的使用,以及线程池的实现。通过示例代码和详细解析,帮助开发者掌握多线程编程的关键技术,提升程序的并发性能和安全性。

herb5的博客 57

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

java de 线程池

线程池: java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 作用:解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 使用情况: 假设一个服务器完成一项任务所需时间为: T1 创建线程时间, T2 在线程中执行任务的时间, T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 组成部分: ...

tayloramanda的博客 901

ClickHouse的bitmap使用

ClickHouse的bitmap使用 bitmap的基本使用 在CK中bitmap有两种构建方式,在ClickHouse的官网有说明: (1)一个是由聚合函数groupBitmapState构造的, (2)另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。 bitmap实战 数据和基本数据表准备 创建一张基本表,一个用户表,有多个描述的维度,每个维度由该维度的唯一id。 CREATE TABLE test02(id UInt16, tag1 UInt8, tag2 UInt8,

zg_hover的专栏 5654

win32线程池代码(WinApi/C++)

win32线程池代码(WinApi/C++)健壮, 高效,易用,易于扩, 可用于任何C++编译器 //说明, 这段代码我用了很久, 我删除了自动调整规模的代码(因为他还不成熟)/*******************************************************************  Thread Pool For Win32 *  VC++ 6, BC++ 5.

陈坚 浙江绍兴 1万+

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

C++26前瞻:从Herb Sutter离职微软看下一代C++标准演进

正如Stroustrup所说,C++的进化始终在"不破坏现有代码"与"拥抱新范式"间保持平衡。C++26延续这一哲学,通过编译器的智能升级让老代码自动获益,这种设计智慧值得所有语言学习者深思。:增强的std::execution库将重构异步操作模型,通过标准化任务调度策略和并行算法,使开发者能更简单地编写高性能并发代码。这种"零成本安全"设计既保持性能优势,又解决了70%的内存安全问题。:编译时代码生成能力被视为"改变游戏规则的特性",允许在预处理阶段动态生成模板代码。对于想提前体验的开发者,

IronwoodPanther89的博客 407

提升ARM Cortex-M系统性能的关键技术:TCM技术解析与实战指南

TCM技术为ARM Cortex-M处理器提供了宝贵的确定性性能提升手段,特别适合对时序敏感的实时应用。通过合理配置和优化,工程师可以显著提高系统性能、降低中断响应时间并优化功耗。随着嵌入式系统对实时性要求的不断提高,TCM技术将在工业控制、汽车电子、医疗设备等领域发挥更加重要的作用。未来,ARM处理器可能会进一步扩展TCM容量并优化其与其他内存子系统的协同工作方式,为开发者提供更强大的实时性能保障。

1681

告别回调地狱:ThreadPool项目的协程改造指南

你是否在C++开发中遇到过这些困境?多线程编程时的回调嵌套像迷宫一样难以维护,线程创建销毁的开销让程序性能大打折扣,异步任务的错误处理变得异常复杂。今天,我们将通过改造[ThreadPool.h](https://link.gitcode.com/i/d432cf4dca7785c47dcfed0b8657cc38)项目,展示如何用协程(Coroutine)解决这些问题,让并发编程变得简单而高效。...

gitblog_01145的博客 470

PyTorch深度学习实战(47)——使用PyTorch构建Transformer模型

相较于传统模型,如循环神经网络 (RNN),Transformer 的优势在于能够理解输入和输出序列中元素之间的关系,在大语言模型 (如 ChatGPT 和 DeepSeek) 的发展中起到了关键作用,为了从零开始构建 Transformer,首先探讨自注意力机制,包括查询 (query)、键 (key) 和值 (value) 向量,以及缩放点积注意力 (SDPA)。将层归一化和残差连接集成到多头注意力层中,并与前馈层结合,构建编码器层,堆叠编码器层构建编码器,还将实现 Transformer 中的解码器。

盼小辉丶的博客 3万+

5、Visual Studio Code:强大的编码与文件管理功能

本文详细介绍了 Visual Studio Code 的强大编码与文件管理功能,涵盖代码导航、引用查找、符号重命名、实时代码分析、IntelliCode 提示、文件和文件夹操作等内容。通过功能对比、流程图和实际开发案例,展示了 VS Code 如何提升开发效率和代码质量,适用于各类编程语言和项目开发场景。

water的专栏 134

D3D12翻译层使用指南

D3D12翻译层使用指南 项目介绍 D3D12翻译层是一款由微软开发的辅助库,其核心功能在于桥接Direct3D 11(D3D11)样式的图形工作流程与Direct3D 12(D3D12)的低级API之间。此库允许开发者以更熟悉的D3D11方式操作图形命令,而实际运行在效率更高的D3D12架构上。D3D11应用程序通常采用单线程录制命令,并假设CPU和GPU操作同步执行,而D3D12要求手动管理资...

gitblog_00260的博客 675

数字IC/FPGA 秋招知识点不全面整理

数字IC/FPGA 秋招知识点不全面整理

w0shishabi的博客 7866

C++20 std::source_location:告别宏的现代日志与性能剖析利器

在C++开发中,日志记录和性能剖析是诊断问题、优化代码的关键技术。传统方法依赖编译器宏(如__FILE__、__LINE__)来获取代码位置信息,但这会带来宏展开的副作用、晦涩的错误信息,并与C++20模块等现代特性存在兼容性问题。其原理是通过宏在预处理阶段进行文本替换,虽简单但缺乏类型安全。C++20引入的std::source_location标准库组件,从设计上解决了这些问题。它通过一个轻量级的类对象,在编译期安全地捕获调用点的文件名、行号、列号和函数名,实现了类型安全且无宏的上下文信息获取。这一改进

chengyixian7877的博客 381

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux多线程编程100问:从基础到高级面试指南

多线程编程是现代操作系统并发处理的核心技术,通过轻量级进程(LWP)实现线程的创建与管理。其核心原理在于共享进程资源的同时保持独立执行流,关键技术包括线程同步机制(互斥锁、条件变量)和线程通信方式(信号量、事件通知)。在Linux系统编程中,合理使用这些机制能显著提升程序性能,特别是在高并发服务器、实时系统等场景。常见的线程安全问题如竞态条件、死锁等,可以通过锁粒度控制、无锁编程等技术优化。本指南深入解析100个典型面试问题,涵盖线程基础概念、同步机制实现原理等核心知识点,帮助开发者系统掌握Linux/Un

weixin_33984032的博客 338

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Node.js事件循环与单线程真相:I/O密集型架构核心解析

Node.js常被误读为‘单线程阻塞模型’,实则是基于事件驱动的异步I/O调度系统。其核心在于事件循环(Event Loop)协调JavaScript主线程、V8引擎、libuv线程池与操作系统内核四层协作,将耗时操作卸载至后台,实现高并发低延迟。这种设计天然适配I/O密集型场景——如实时通信、API网关、流式数据处理,但不擅CPU密集型任务。理解event loop阶段(timers、poll、check等)与微任务/宏任务执行顺序,是避免回调地狱、定时器失准、长尾延迟等生产问题的关键。结合V8内存机制与

weixin_30765505的博客 332

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#基础复习笔记

这句代码会把teacher1在栈上的值复制给teacher2,然后再改变teacher1在栈上的值,与teacher2无关。注意:并不是所有值类型都存储在栈上,当在方法内部定义的局部变量才存在栈上,当作为类的字段存在的值类型,跟着类的实例对象一起存在堆上。此时,people2与people1指向的是堆上的同一块内存,因此people2.Name 是"张三"类的成员包含字段(静态、非静态)、属性(静态、非静态)、方法(静态、非静态)、常量等。(2)类是引用类型存储在堆上,结构体是值类型存储在栈上。

LONGZHIQIN的博客 1328

Android 渲染流水线全解析:从 Choreographer 到 SurfaceFlinger

核心记忆点VSync 是节拍器:Choreographer 靠它对齐绘制节奏Surface 是画布:应用画完提交给系统SurfaceFlinger 是合成器:把多个应用的 Layer 拼成一张图HWC 是加速器:能用硬件就不用 GPU,省电省资源卡顿在应用层:系统层通常不是瓶颈,主线程耗时才是。

天行健,君子以自强不息。 417

本地AI编程助手部署指南:Pi Agent与Kimi K3模型实战

AI编程助手正成为提升开发效率的关键工具,其核心原理是基于大语言模型的代码理解与生成能力。通过自然语言处理技术,这类工具能够将开发者的意图转化为可执行代码,实现智能补全、错误调试和文档生成等功能。其技术价值在于显著降低重复性编码工作负担,加速原型开发和问题排查。在应用场景上,AI编程助手广泛适用于日常编码、代码审查、项目脚手架生成等环节。然而,云端服务常面临网络延迟、数据隐私和持续成本等问题。为此,开源本地部署方案应运而生,它允许开发者在自有硬件上运行AI助手,确保数据完全本地处理。本文聚焦于Pi Agen

weixin_33911824的博客 443
上一篇: 累积梯度下降,随机梯度下降,基于mini-batch 的随机梯度下降
下一篇: C++实现职责链模式
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值