c++11实现的多线程管理

C++23 多线程详解(全网最全,代码均已实测) 本文全面详解C++23多线程特性,基于GCC 14.2与-std=c++23编译通过,经ThreadSanitizer验证无数据竞争。涵盖std::jthread、std::stop_token、std::latch/barrier/counting_semaphore、std::atomic::wait、std::print及std::move_only_function等新特性,修复旧版线程池死锁与资源泄漏问题。强调避免detach,推荐使用自动管理生命周期的jthread,并提供完整可运行示例,确保跨 阅读详情

c++11的一些特性,有点模糊了,撸个c++11实现的简易线程池玩玩,强化一下记忆。

目录

threadManage.h

threadManage.cpp

main.cpp


threadManage.h

#pragma once

#include <thread>
#include <vector>
#include <queue>
#include <condition_variable>
#include <mutex>
#include <iostream>
using namespace std;

class ThreadManage
{
	typedef std::function < void() > Task;
public:
	ThreadManage(int num);

	~ThreadManage();

public:
	void StartThread();
	void StopThread();
	void AddTask(Task task);

private:
	void Work();

private:
	std::vector<std::thread*> m_threads;
	std::queue<Task> m_task;
	std::mutex m_mutex;
	std::condition_variable m_condtion;
	volatile bool m_bIsBusy;
	int m_ThreadNum;
};

threadManage.cpp

#include "threadManage.h"


ThreadManage::ThreadManage(int num) :m_ThreadNum(num), m_bIsBusy(false)
{
}


ThreadManage::~ThreadManage()
{
	if (m_bIsBusy)
		StopThread();
}

void ThreadManage::StartThread()
{
	m_bIsBusy = true;
	for (int i = 0; i < m_ThreadNum; i++)
	{
		m_threads.push_back(new std::thread(std::bind(&ThreadManage::Work, this)));
		//std::unique_lock<std::mutex> lock(m_mutex);
		//chrono::microseconds time(1000);
		//m_condtion.wait_for(lock, time);
	}
}
void ThreadManage::StopThread()
{
	{
		std::unique_lock<std::mutex> lock(m_mutex);
		m_bIsBusy = false;
	}

	if (!m_threads.empty())
		m_condtion.notify_all();

	for (auto& thread : m_threads)
	{
		if (thread->joinable())
		{
			cout << thread->get_id() << endl;
			thread->join();
			delete thread;
		}
	}
	m_threads.clear();
}
void ThreadManage::AddTask(Task task)
{
	if (m_bIsBusy)
	{
		std::unique_lock<std::mutex> lock(m_mutex);
		m_task.push(task);	
		m_condtion.notify_one();
	}
	
}

void ThreadManage::Work()
{
	while (m_bIsBusy)
	{
		std::unique_lock<std::mutex> lock(m_mutex);
		m_condtion.wait(lock);
		if (m_task.empty()) continue;
		else
		{
			Task task;
			task = m_task.front();
			m_task.pop();
			task();
		}		
	}
}

main.cpp

#include "threadManage.h"

void func()
{
	cout << "func" << endl;
}


int main()
{
	cout << "main" << endl;
	//thread th(func);
	//th.join();

	ThreadManage thread(3);
	thread.StartThread();
	
	for (int i = 0; i < 3; i++)
	{
		thread.AddTask(func);
	}
	std::this_thread::sleep_for(std::chrono::microseconds(1000));
	thread.StopThread();

	return 0;
}

 

C++11 ThreadPool的实现与应用 线程池是一种多线程处理形式,它预先创建一定数量的线程,放在一个池中管理。在需要执行任务时,不是新创建线程,而是直接从线程池中取出一个空闲的线程来执行任务。这种方式可以减少线程创建和销毁的开销,提高程序响应速度,实现资源复用。C++11通过和std::mutex等并发组件,使得实现一个线程池成为可能。任务接口是线程池中最为重要的组件之一,它定义了任务的抽象方式,允许开发者将具体的任务逻辑封装在接口中,以供线程池的工作线程执行。 阅读详情

相关推荐

车载通信技术原理-CAN通讯和代码配置:奥迪A6轿车总线拓扑图

CAN总线是一种用于汽车监测与控制系统的串行通信协议,由德国Bosch公司开发。它具有多主工作方式、优先级仲裁、高抗干扰等特点,支持点对点、广播等多种通信方式,传输距离可达10公里。CAN协议采用差分信号传输,物理层使用双绞线,数据链路层实现错误检测、位填充等功能。协议帧类型包括数据帧、遥控帧、错误帧等。CAN总线自1986年发布以来,已成为汽车电子系统的标准配置,广泛应用于车载网络。文章还提供了S32K144芯片的CAN驱动代码示例。

擎天柱工坊 1066

C++最基本的线程管理(完整源码)

C++最基本的线程管理(完整源码)

编程之道在明明德在亲民在止于至善 1457

防止通达信公式被盗?手把手教你用DLL加密+互联网验证(含易语言后台管理)

本文详细介绍了如何通过DLL加密与互联网验证技术保护通达信公式安全。从DLL加密实现、设备绑定到易语言后台管理,提供了一套完整的防护方案,有效防止公式被盗用。重点讲解了互联网验证登录和绑定设备等核心技术,帮助量化交易者守护核心资产。

weixin_29323551的博客 500

一种实用的c++线程管理方式

线程是我们编程中使用非常频繁的操作。线程本身难度不大,但实际使用中往往棘手,特别是在大量使用中,会遇到线程间同步、关闭释放、跨线程通讯、启动大量线程时耗时等问题。同时多处使用还会产生大量的冗余代码。下面实现一个静态库来解决线程使用中遇到的问题。 使用时需要载入JCThreadManager.h头文件和引入JCThreadManager.lib。使用过程很简单:...

ljc 904

SONiC (6) - SONiC 源码框架分析

https://github.com/sonic-net/sonic-utilitieshttps://github.com/sonic-net/sonic-snmpagenthttps://github.com/sonic-net/sonic-linux-kernelhttps://github.com/sonic-net/sonic-platform-commonhttps://github.com/sonic-net/sonic-platform-daemons以下是在 SONiC 中运行的容器列表:

qq_49477505的博客 1329

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性包括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理

guigenyi的专栏 1810

【C++11多线程】管理线程

索引目录1.使用不带参数的函数创建线程2.带参数的函数创建线程3.函数对象—即仿函数(functor)—创建线程4.成员函数创建线程5. 成员函数创建线程(在构造函数中操作)6.lambda创建线程4.join and detach5.线程的标识参考 线程创建: std::thread threadObj(<CALLBACK>); std::thread()创建一个新的线程可以接受任意的可调用对象类型(带参数或者不带参数),包括lambda表达式(带变量捕获或者不带),函数,函数对象,以及函数

cutemypig的博客 507

爬取百度图片

最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。

weixin_54143563的博客 1939

C++ 11 多线程--线程管理

说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程。 并发编程的方法 通常,要实现并发有两种方法:多进程和多线程。 多进程并发 使用多进程并发是

破竹的博客 662

【IPC】ONVIF Device Manager 测试工具

介绍onvif 协议测试工具

以实战经验介绍行业知识 1955

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

C++中多线程管理

CreateSemaphore

quankangquan的博客 582

爬虫:一文掌握网站加密和混淆以及浏览器调试的技巧

面对加密和混淆技术的网站,传统的爬虫方法可能难以奏效。通过结合浏览器调试工具(如Puppeteer、Playwright)、代理工具(如Burp Suite、Fiddler)以及动态和静态分析技巧,可以深入理解网站的运行机制,绕过加密和混淆,实现有效的数据抓取。同时,务必注意合法合规,尊重目标网站的规则和用户的隐私,确保爬虫行为的正当性和可持续性。

数据知道的博客 9887

C++视频语音聊天室实现教程

1.C++中级开发者:已掌握C++基础,想要提升网络编程和并发编程能力2.网络应用开发者:想学习现代WebSocket和HTTP服务器实现3.音视频技术爱好者:希望了解WebRTC技术原理和实现方法4.全栈开发学习者:想通过一个实际项目学习前后端结合的开发模式5.系统架构师初学者:可以学习一个简洁但功能完整的系统架构设计项目不适合完全的C++初学者,因为需要具备C++11特性、多线程编程和基本网络知识的基础。首先,让我们看看Message.hJOIN_ROOM, // 加入房间。

一个时代的落幕,一个时代的开启。 218

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一文详解C++多线程

传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的,或者windows下的 。C++11提供了语言层面上的多线程,包含在头文件中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C++11 新标准中引入了5个头文件来支持多线程编程,如下图所示:

非晚非晚的博客 9万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

浅谈C++之多线程实现

传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h>。C++11提供了语言层面上的多线程,包含在头文件<thread>中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。

a876106354的博客 1039

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

(一)C++11 原生标准多线程:认识多线程

之所以称之为C++11原生标准多线程,因为在C++中C++11版本才加入的多线程。所谓原生也就是C++语言自带的,区别于其他库实现,比如POSIX,Boost,winAPI,QT等的多线程实现。 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在...

开软古剑楠 1034

C++11 多线程

多线程编程基本概念:并发、并行                                     线程、进程                                     同步、互斥 并发:宏观上线程同时执行,微观上线程交替执行,也即基本单位为一个时间段 并行:同一时刻,多个线程同时执行,也即以时间点为基本单位       C++11标准库中提供了多线程库,使用#i...

m0_37895939的博客 214

c++11、14多线程从原理到线程池

C+11 14 17 多线程从原理到线程池为什么要使用多线程?

qq_24867003的博客 1541

C++ 多线程编程(一):std::thread的使用

说到多线程编程,就不得不提并行和并发,多线程是实现并发和并行的一种手段。并行是指两个或多个独立的操作同时进行。并发是指一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程。C++11之前,window和linux平台分别有各自的多线程标准,使用C++编写的多线程往往是依赖于特定平台的。

海纳百川,有容乃大。 2万+

C++语言:面试官喜欢问什么

通过对C++技术面试题中高频关键词的分析,本文总结了面向对象编程、内存管理、多线程、STL容器、智能指针、底层原理等核心内容。这些关键词反映了后端开发、嵌入式、算法岗、系统开发等岗位的常见考察方向。文章详细解析了虚函数、智能指针、多态、底层实现原理、STL容器、多线程与线程安全、C++11新特性等重点内容,并提供了学习建议和推荐资源。掌握这些核心知识模块,能够帮助应聘者更有针对性地准备C++技术面试,提升通过率。

ocean2103的专栏 1523

c++11多线程学习

c++11多线程

weixin_52600845的博客 1945

c++多线程

thread>:创建和管理线程。<future>:异步编程和获取结果。<mutex>:线程同步,保护共享资源。:线程间通信和同步。<atomic>:无锁编程,避免数据竞争。<barrier>和<latch>:线程同步(C++20)。根据具体需求选择合适的方式,可以实现高效、安全的并发编程。

如履薄冰 824

C++多线程详解(全网最全)

来源丨Qt教程点击进入—>3D视觉工坊学习交流群在C++学习过程中,要想“更上一层楼”的话,多线程编程是必不可少的一步,前面的文章多半是基础方面的内容,这节的话稍微有点拔高。所以说,我们在看这篇文章的时候,大家需要更多的思考是为什么这么做?这样做的好处是什么?以及多线程编程都可以应用在哪里?话不多说,跟着我一起认真探讨这块内容。1、多线程传统的C++(C++11标准之前)中并没有引入线程这个...

3D视觉工坊 9808

C++11 的线程相关

C++11 的线程库和相关工具为我们提供了丰富的工具来管理线程、进行异步任务和实现线程间同步。提供了最基础的线程功能,而std::async和提供了更高层次的异步任务管理,使得线程编程更加简洁。通过std::mutex等同步工具,我们可以确保线程安全地共享资源。在实际开发中,我们推荐尽量使用std::async和,以避免直接暴露线程细节,减少并发编程的复杂度。

pumpkin84514的博客 886

c++11 多线程学习记录

#include<iostream> #include<thread> using namespace std; void func1(){ cout<<"func1 thread id "<<this_thread::get_id()<<endl; cout<<"begin func1"<<endl; for(int i=0;i<10;i++){ // this_thread:

wzzzj的博客 988
上一篇: C/C++实现字符串的反向输出
下一篇: 欢聚时代c++开发岗位面试经验
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值