手写线程池,能进行任务窃取的线程池---注释

目录

function_wrapper.hpp:

stealing_queue.hpp

thread_pool_steal.hpp


参考:《C++并发编程实战》

对于thread_pool_steal.hpp的代码有改动,不然运行不了,详细代码和测试代码参考下一篇文章。

function_wrapper.hpp:

//包装可调用对象,对外消除对象型别,还需要有一个函数调用符

//

//

//私有成员:

// 1.一个虚基类(没有的话在3很难定义一个指向实例化类的指针)

// struct impl_base{

// 1.一个纯虚函数用来让派生类继承3执行函数

// 2.虚析构函数

// }

// 2.因为需要接受任意类型的可调用对象,所以内部需要封装一个模板类(派生自1>)

// template<typename F>

// struct impl_type{

// 1.成员变量:传入的函数

// 2.构造函数:移动构造成员变量

// 3.成员函数:执行函数

// }

// 3.一个指向实例化后的指针(在这里看出确实需要一个基类,可以通过基类指针构

造派生类指针)

//公有成员:

// 1.构造函数,因为接收的对象是任意类型,所以是模板构造函数,并且使用万能引

用和完美转发实例化私有成员的3.

// 2.()运算符的重载通过调用私有成员2.的3.实现

// 3.默认构造函数 = default

// 4.移动拷贝构造函数

// 5.移动复制构造函数

//

//函数包装器
//包装可调用对象,对外消除对象型别,还需要有一个函数调用符
//
//
//私有成员:
//	1.一个虚基类(没有的话在3很难定义一个指向实例化类的指针)
//	struct impl_base{
//		1.一个纯虚函数用来让派生类继承3执行函数
//		2.虚析构函数
//	}
//	2.因为需要接受任意类型的可调用对象,所以内部需要封装一个模板类(派生自1)
//	template<typename F>
//	struct impl_type{
//		1.成员变量:传入的函数
//		2.构造函数:移动构造成员变量
//		3.成员函数:执行函数
//	}
//	3.一个指向实例化后的指针(在这里看出确实需要一个基类,可以通过基类指针构造派生类指针)
//公有成员:
//	1.构造函数,因为接收的对象是任意类型,所以是模板构造函数,并且使用万能引用和完美转发实例化私有成员的3.
//	2.()运算符的重载通过调用私有成员2.的3.实现
//	3.默认构造函数 = default
//	4.移动拷贝构造函数
//	5.移动复制构造函数
//

stealing_queue.hpp

//可以进行任务窃取的队列

//

//私有成员:

// 1.一个双端队列,pop操作在队头进行,steal操作在队尾进行,存储的内容为function_wrapper类

// 2.互斥 保证安全,因为不存储线程,所以不需要条件变量传递线程运行信息

//公有成员:

// 1.默认构造函数

// 2.push

// 3.try_pop

// 4.try_steal基本和pop都一样,就是弹出队尾元素//在线程池中定义一个存储窃取

队列的vector,vector的索引代表每个线程的标识,这样每个线程就可以通过这个vector访>问窃取队列。

// 5.empty

//可以进行任务窃取的队列
//
//私有成员:
//	1.一个双端队列,pop操作在队头进行,steal操作在队尾进行,存储的内容为function_wrapper类
//	2.互斥 保证安全,因为不存储线程,所以不需要条件变量传递线程运行信息
//公有成员:
//	1.默认构造函数
//	2.push
//	3.try_pop
//	4.try_steal基本和pop都一样,就是弹出队尾元素//在线程池中定义一个存储窃取队列的vector,vector的索引代表每个线程的标识,这样每个线程就可以通过这个vector访问窃取队列。
//	5.empty

thread_pool_steal.hpp

//私有成员:

// 1.控制线程正常运行的原子变量,抛出异常设置为true

// 2.线程池的池队列,基于普通的线程安全队列

// 3.提供索引的队列存储指向窃取队列的指针

// 4.存放线程的队列

// 5.封装可联结线程

// 6.静态本地线程变量 本地线程队列

// 7.静态本地线程变量 索引

//

// 8.work_thread工作函数(任务函数)

// 9.判断能否从 本地线程队列获取任务

// 10.判断能否从 线程池队列获取任务

// 11.判断能否从 其他线程窃取任务

//公有成员:

// 1.构造函数:初始化原子变量,可联结线程类。

// {

// try

// {

// for()

// {初始化提供索引的队列 }

// for()

// {初始化线程}

// }

// catch

// }

// 2.提交任务函数//为了获取返回值应该返回future,传入各种函数,所以应该是模

板函数{

// 1.传入函数打包给pakage_task

// 2.获取future

// 3.判断是传入本地线程队列还是线程池队列

// 4.return future;

// }

// 3.run_package_task//work_thread的主要部分

// {

// if(判断从哪个队列获得任务)

// {

// task()

// }

// else 交出cpu时间。

// }

// 4.析构函数

//私有成员:
//	1.控制线程正常运行的原子变量,抛出异常设置为true
//	2.线程池的池队列,基于普通的线程安全队列
//	3.提供索引的队列存储指向窃取队列的指针
//	4.存放线程的队列
//	5.封装可联结线程
//	6.静态本地线程变量 本地线程队列
//	7.静态本地线程变量 索引
//
//	8.work_thread工作函数(任务函数)
//	9.判断能否从 本地线程队列获取任务
//	10.判断能否从 线程池队列获取任务
//	11.判断能否从 其他线程窃取任务
//公有成员:
//	1.构造函数:初始化原子变量,可联结线程类。
//	{
//		try
//		{	
//			for()
//			{初始化提供索引的队列
//			}
//			for()
//			{初始化线程}
//		}
//		catch
//	}
//	2.提交任务函数//为了获取返回值应该返回future,传入各种函数,所以应该是模板函数{
//		1.传入函数打包给pakage_task
//		2.获取future
//		3.判断是传入本地线程队列还是线程池队列
//		4.return future;
//	}
//	3.run_package_task//work_thread的主要部分
//	{
//		if(判断从哪个队列获得任务)
//		{
//			task()
//		}
//		else 交出cpu时间。
//
//	}
//
相关推荐
yuyanjingtao2 分钟前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
Code哈哈笑9 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶12 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184415 分钟前
shell 编程(二)
开发语言·bash·shell
闻缺陷则喜何志丹18 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie11451419129 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满29 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99936 分钟前
PHP中替换某个包或某个类
开发语言·php
小林熬夜学编程40 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
m0_7482361143 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust