多线程之手撕线程池

news/2024/9/24 0:46:09

要点

  • 线程池,功能是管理线程资源,管理任务队列。空闲线程从任务队列中取出任务完成,需要线程时将任务挂在任务对列。
  • 由于对任务队列的操作要实现同步,引入了互斥信号量和条件变量。
  • 当线程池生命周期结束时,不允许再挂载任务,引入一个原子变量stop_flag
  • 实现线程池ThreadPool类,成员变量有:
    • vector : workers
    • queue<function<void()>> : tasks
    • mtx : mutex
    • cv :conditon_vatiable
    • stop_flag : atomic
  • 实现线程池ThreadPool类,成员函数有:
    • ThreadPool(int size) : 开辟大小为size的线程池,创建size个线程worker存在workers里,安排worker从tasks中取出任务执行
    • void puts(Function<void()>&& F) : 把任务f挂在任务队列tasks下
    • ~ThreadPool() : stop并join结束所有线程

代码实现

  #include <iostream>#include <vector>#include <queue>#include <thread>#include <memory>#include <mutex>#include <atomic>#include <functional>using namespace std;class ThreadPool {private:vector<thread> workers;queue<function<void()>> tasks;mutex mtx_for_que;condition_variable cv;atomic<bool> stop_flag;public:ThreadPool(int size);void make_Task(function<void()>&& f);~ThreadPool();};ThreadPool::ThreadPool(int size) : stop_flag(false) {for (int i = 0; i < size; ++i) {workers.emplace_back([this]() {for (;;) {unique_lock<mutex> ulock(this->mtx_for_que);while (!this->stop_flag && this->tasks.empty()) {this->cv.wait(ulock);}if (this->stop_flag && this->tasks.empty()) {return;}function<void()> task = move(this->tasks.front());this->tasks.pop();// 执行task();}});}}void ThreadPool::make_Task(function<void()>&& f) {function<void()> task = f;unique_lock<mutex> ulock(mtx_for_que);if (stop_flag) {cout << "This ThreadPool has been stopped!" << endl;return;}tasks.emplace([task]() {(task)(); });cv.notify_one();return;}ThreadPool::~ThreadPool() {stop_flag = true;cv.notify_all();for (auto& worker : workers) {worker.join();}return;}int main() {ThreadPool pool(4);for (int i = 0; i < 20; ++i) {pool.make_Task([i]() {cout << i << endl;});}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

机器学习第6次作业

机器学习作业6 学号:102102156 姓名:高涛 1. 朴素贝叶斯与KNN分类性能比较 1.1 代码1.2 绘制结果2.维数约简可视化 2.1 代码2.2 绘制结果3.1 降维前后分类精度比较 3.1 代码同上 3.2绘制结果

Docker 部署 vue 项目

概述 技术栈:docker + vue + nginx 1、docker下载安装 nginx docker pull nginx2、创建nginx挂载目录 /usr/local/nginx (可根据自己需要存放文件的位置自行创建目录) mkdir -p /usr/local/nginx3、vim 创建default.conf server {listen 80;server_name localhost;#c…

TCP协议三次握手的个人理解

TCP协议的核心是可靠的数据传输,而保证传输是可靠的那就要求客户端和服务端双方都具备正常的收发功能。 基于此,第一次握手的时候,当服务端接收到这个SYN请求时,表明客户端要进行TCP连接,同步序列号seq=x,那么从服务端的角度来看: 1、客户端的发送能力是正常的; 服务端…

[vulnhub]LAMPSecurity: CTF5

https://www.vulnhub.com/entry/lampsecurity-ctf5,84/主机发现端口扫描探测存活主机,139为靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-23 17:27 CST Nmap scan report for 192.168.75.1 Host is up (0.00049s latency). MAC Address…

jni安全利用的简单学习

首先定义一个最简单的类 public class EvilClass {public static native String execCmd(String cmd); } 因为我是MacOs端,在当前目录执行 javac EvilClass.java javac -h . EvilClass.java 生成 EvilClass.h 文件 /* DO NOT EDIT THIS FILE - it is machine generated */ #i…

day6[Llamaindex RAG实践]

"xtuner是什么?"在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答的能力

【专题】2024AI智慧生活白皮书:AI智能科技重塑居家体验报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37748 AI 已然成为家电家居市场的创新核心动力,可在个性化识别、预测维护等多方面提升产品价值。家享生活行业智能化展现多元场景,清洁智能崛起超厨房智能居第二,全屋智能潜力巨大。“套装 / 集成智能” 等品类增长快,智能新客多由老客升级…

kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传

1、kettle本身文件上传功能不是很友好,甚至是不能直接使用,需要调整文件上传接口才可以正常接收到文件,本次讲解内容主要是通过自定义插件解决这个问题。 2、通过springboot 编写简单demo,模拟文件上传,接口支持三个参数unitCode、password、和文件dataFile。 java代码如下…