#include<iostream>
#include<thread>
#include<mutex>
#include<string>
#include<condition_variable>
#include<queue>
#include<vector>
#include<functional>
class ThreadPool
{
public:
ThreadPool(int numThreads) : stop(false) {
for (int i = 0; i < numThreads; i++) {
threads.emplace_back([this]() {
while (1) {
std::unique_lock<std::mutex> lock(mtx);
condition.wait(lock, [this]() {
return !tasks.empty() || stop;
});
if (stop && tasks.empty()) {
return;
}
std::function<void()> task(std::move(tasks.front()));
tasks.pop();
lock.unlock();
task();
}
});
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(mtx);
stop = true;
}
condition.notify_all();
for (auto& t : threads) {
t.join();
}
}
template<class T, class... Args>
void enqueue(T&& t, Args&&... args) {
std::function<void()> task =
std::bind(std::forward<T>(t), std::forward<Args>(args)...);
{
std::unique_lock<std::mutex> lock(mtx);
tasks.emplace(std::move(task));
}
condition.notify_one();
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> tasks;
std::mutex mtx;
std::condition_variable condition;
bool stop;
};
class ThreadPoolSingleton
{
public:
ThreadPoolSingleton(const ThreadPoolSingleton&) = delete;
ThreadPoolSingleton& operator=(const ThreadPoolSingleton&) = delete;
static ThreadPoolSingleton& getInstance() {
static ThreadPoolSingleton instance;
return instance;
}
template<class T, class... Args>
void enqueue(T&& t, Args&&... args) {
std::function<void()> task =
std::bind(std::forward<T>(t), std::forward<Args>(args)...);
{
std::unique_lock<std::mutex> lock(mtx);
tasks.emplace(std::move(task));
}
condition.notify_one();
}
private:
ThreadPoolSingleton() : stop(false) {
int numThreads = std::thread::hardware_concurrency(); // 硬件支持的线程数
for (int i = 0; i < numThreads; i++) {
threads.emplace_back([this]() {
while (1) {
std::unique_lock<std::mutex> lock(mtx);
condition.wait(lock, [this]() {
return !tasks.empty() || stop;
});
if (stop && tasks.empty()) {
return;
}
std::function<void()> task(std::move(tasks.front()));
tasks.pop();
lock.unlock();
task();
}
});
}
}
~ThreadPoolSingleton() {
{
std::unique_lock<std::mutex> lock(mtx);
stop = true;
}
condition.notify_all();
for (auto& t : threads) {
t.join();
}
}
std::vector<std::thread> threads;
std::queue<std::function<void()>> tasks;
std::mutex mtx;
std::condition_variable condition;
bool stop;
};
int main() {
//ThreadPool pool(4);
//for (int i = 0; i < 10; i++) {
// pool.enqueue([i]() {
// std::cout << "任务:" << i << "正在运行" << std::endl;
// std::this_thread::sleep_for(std::chrono::seconds(1));
// std::cout << "任务:" << i << "结束运行" << std::endl;
// });
//}
ThreadPoolSingleton::getInstance();
for (int i = 0; i < 10; i++) {
ThreadPoolSingleton::getInstance().enqueue([i]() {
std::cout << "任务:" << i << "正在运行" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "任务:" << i << "结束运行" << std::endl;
});
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
c++11多线程-从零基础到手撕线程池 (187个子文件)
源.cpp 3KB
Դ.cpp 880B
源.cpp 695B
源.cpp 686B
Դ.cpp 521B
源.cpp 460B
Դ.cpp 317B
源.cpp 280B
Browse.VC.db 41.63MB
Solution.VC.db 1.07MB
06-实现跨平台线程池.exe 159KB
05-condition_variable.exe 126KB
03-互斥量解决多线程数据共享问题.exe 121KB
07-异步并发.exe 118KB
C++11_Thread.exe 93KB
04-call_once.exe 89KB
02-数据未定义错误.exe 84KB
08-原子操作atomic.exe 74KB
08-原子操作atomic.vcxproj.filters 965B
07-异步并发.vcxproj.filters 965B
C++11_Thread.vcxproj.filters 965B
04-call_once.vcxproj.filters 965B
02-数据未定义错误.vcxproj.filters 965B
05-condition_variable.vcxproj.filters 965B
03-互斥量解决多线程数据共享问题.vcxproj.filters 965B
06-实现跨平台线程池.vcxproj.filters 965B
vc143.idb 307KB
vc143.idb 227KB
vc143.idb 203KB
vc143.idb 187KB
vc143.idb 179KB
vc143.idb 171KB
vc143.idb 171KB
vc143.idb 171KB
06-实现跨平台线程池.ilk 1.73MB
05-condition_variable.ilk 1.57MB
07-异步并发.ilk 1.18MB
C++11_Thread.ilk 1.13MB
03-互斥量解决多线程数据共享问题.ilk 1006KB
02-数据未定义错误.ilk 911KB
04-call_once.ilk 890KB
08-原子操作atomic.ilk 841KB
Դ.ipch 52.88MB
Դ.ipch 42.63MB
Դ.ipch 42.38MB
Դ.ipch 41.88MB
Դ.ipch 41.88MB
Դ.ipch 41.88MB
Դ.ipch 37.13MB
Դ.ipch 37.13MB
THREADPOOL.ipch 896KB
08-原子操作atomic.lastbuildstate 189B
07-异步并发.lastbuildstate 189B
C++11_Thread.lastbuildstate 189B
04-call_once.lastbuildstate 189B
02-数据未定义错误.lastbuildstate 189B
05-condition_variable.lastbuildstate 189B
03-互斥量解决多线程数据共享问题.lastbuildstate 189B
06-实现跨平台线程池.lastbuildstate 189B
03-互斥量解决多线程数据共享问题.log 527B
06-实现跨平台线程池.log 230B
02-数据未定义错误.log 224B
08-原子操作atomic.log 218B
05-condition_variable.log 218B
07-异步并发.log 206B
C++11_Thread.log 200B
04-call_once.log 200B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
vcpkg.applocal.log 5B
源.obj 660KB
源.obj 395KB
Դ.obj 386KB
源.obj 375KB
Դ.obj 253KB
Դ.obj 206KB
源.obj 172KB
源.obj 104KB
ThreadPool.obj 59KB
06-实现跨平台线程池.pdb 2.76MB
07-异步并发.pdb 2.13MB
05-condition_variable.pdb 2.04MB
C++11_Thread.pdb 2.02MB
03-互斥量解决多线程数据共享问题.pdb 1.96MB
08-原子操作atomic.pdb 1.86MB
02-数据未定义错误.pdb 1.86MB
04-call_once.pdb 1.56MB
vc143.pdb 796KB
vc143.pdb 732KB
vc143.pdb 580KB
vc143.pdb 484KB
vc143.pdb 452KB
vc143.pdb 452KB
vc143.pdb 444KB
vc143.pdb 436KB
共 187 条
- 1
- 2
资源评论
coding_听
- 粉丝: 134
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于NetCore3.1和Vue的系统管理平台.zip
- (源码)基于Arduino的蓝牙控制LED系统.zip
- SwitchResX 4.6.4 自定义分辨率 黑苹果神器
- (源码)基于Spring Boot和MyBatis的大文件分片上传系统.zip
- (源码)基于Spring Boot和MyBatis的后台管理系统.zip
- (源码)基于JDBC的Java学生管理系统.zip
- (源码)基于Arduino的教室电力节能管理系统.zip
- (源码)基于Python语言的注释格式处理系统.zip
- (源码)基于C++的嵌入式文件系统管理工具.zip
- (源码)基于JavaFX框架的动画与界面管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功