news 2026/5/17 4:39:23

C++11 简单实现线程池的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++11 简单实现线程池的方法

么是线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

不使用线程池有哪些弊端

创建太多线程,将会浪费一定的资源,有些线程未被充分使用。
销毁太多线程,将导致之后浪费时间再次创建它们。
创建线程太慢,将会导致长时间的等待,性能变差。
销毁线程太慢,导致其它线程资源饥饿。

线程池的组成部分

1、线程池管理器(ThreadPoolManager):用于创建并管理线程池
2、工作线程(WorkThread): 线程池中线程
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制

下面直接看代码实现

ThreadPoolManage.hpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

#pragma once

#include <thread>

#include <vector>

#include <queue>

#include <condition_variable>

#include <mutex>

/*

* 抽象一个任务 根据自己的需求扩展

*/

classAbsTask

{

public:

AbsTask() =default;

virtual~AbsTask() =default;

public:

virtualvoidrun() = 0;

};

template<class_Ty>

classThreadPoolManage

{

public:

ThreadPoolManage(unsignedintnMaxThread)

:mMaxThreadNum(nMaxThread)

, mThreadStatus(false)

{

//启动的时候就要创建线程

auto maxNum = std::thread::hardware_concurrency();

//获取当前操作系统中CPU的核心数量 根据核心数量来设置 最大工作线程的并发数量

mMaxThreadNum = mMaxThreadNum > maxNum ? maxNum : mMaxThreadNum;

//创建工作线程池

for(auto i = 0; i < mMaxThreadNum; i++)

{

mWorkers.emplace_back([this] {

while(true)

{

std::unique_lock<std::mutex> lock(this->mQueue_mutex);

this->mCondition.wait(lock, [this]() {returnthis->mThreadStatus || !this->mTasks.empty(); });

if(this->mThreadStatus &&this->mTasks.empty())

{

return;

}

//获取队列头部的任务

auto task = std::move(this->mTasks.front());

//任务出队

this->mTasks.pop();

//执行工作

task.run();

}

});

}

}

~ThreadPoolManage()

{

{

std::unique_lock<std::mutex> lock(this->mQueue_mutex);

this->mThreadStatus =true;

}

//通知所有线程起来工作 然后退出

this->mCondition.notify_all();

//等待所有线程工作完毕

for(std::thread& worker :this->mWorkers)

{

if(worker.joinable()) {

worker.join();

}

}

}

/*

* 添加任务到任务队列

*/

voidaddTask(_Ty& task)

{

std::unique_lock<std::mutex> lock(this->mQueue_mutex);

if(mThreadStatus) {

throwstd::runtime_error("workers stop");

}

mTasks.emplace(std::move(task));

mCondition.notify_one();

}

private:

/*

* 工作线程池

*/

std::vector<std::thread> mWorkers;

/*

* 任务队列

*/

std::queue<_Ty> mTasks;

/*

工作线程的最大并发数量

*/

unsignedintmMaxThreadNum;

/*

条件变量 控制线程池中线程的工作状态

*/

std::condition_variable mCondition;

/*

* 工作线程锁

*/

std::mutex mQueue_mutex;

/*

* 控制线程的开关 false 继续工作 true 退出线程

*/

boolmThreadStatus;

};

调用代码

main.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include <iostream>

#include <chrono>

#include "ThreadPool.hpp"

classTask :publicAbsTask

{

public:

voidrun() override

{

std::this_thread::sleep_for(std::chrono::seconds(1));

std::cout <<"works ...... "<< std::this_thread::get_id() << std::endl;

}

};

intmain()

{

ThreadPoolManage<Task> ThreadPool(8);

for(size_ti = 0; i < 256; i++)

{

Task task;

ThreadPool.addTask(task);

}

std::cin.get();

system("pause");

}

到此这篇关于C++11 简单实现线程池的方法的文章就介绍到这了


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 4:38:47

希尔顿花园酒店重点发力粤港澳大湾区和川渝经济圈 | 美通社头条

、美通社消息&#xff1a;在5月14日于上海举办的2026年希尔顿花园酒店投资峰会上&#xff0c;希尔顿花园酒店达成30项签约或合作意向&#xff0c;涵盖三个首次进驻的文旅目的地和北上广深四大核心城市商务区&#xff0c;进一步拓展品牌在中国市场的版图。这一丰硕成果不仅体现了…

作者头像 李华
网站建设 2026/5/17 4:38:32

Google Dorking自动化工具:原理、部署与实战应用

1. 项目概述与核心价值最近在整理自己的渗透测试工具箱时&#xff0c;又翻出了这个老伙计——Jrgil20/GoogleDorkingTool。这可不是一个简单的脚本集合&#xff0c;而是一个将Google Dorking&#xff08;谷歌黑客技术&#xff09;从手动、零散的搜索&#xff0c;转变为系统化、…

作者头像 李华
网站建设 2026/5/17 4:38:05

Adobe-GenP完整指南:5分钟快速激活Adobe全家桶的终极方案

Adobe-GenP完整指南&#xff1a;5分钟快速激活Adobe全家桶的终极方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud高昂的订阅费用而烦…

作者头像 李华
网站建设 2026/5/17 4:38:03

Tinke:专业的NDS游戏资源查看与编辑工具完整指南

Tinke&#xff1a;专业的NDS游戏资源查看与编辑工具完整指南 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke 项目概述与核心价值 Tinke是一款专门用于查看、转换和编辑任天堂DS&#xff08;NDS&…

作者头像 李华