C/C++ 智能指针线程池
//这个线程池存在一定的BUG 如果没有多线程编程基础的先生请谨慎使用
//我放弃了这种模板方式的线程池,最好不要使用!!!!!!!
ThreadPool.h
{
#ifndef __THREADPOOL_H__
#define __THREADPOOL_H__
#include <memory>
#include <mutex>
#include <iostream>
#include <thread>
#include <vector> typedef unsigned int THREADHANDLE;
static THREADHANDLE ThreadHanle = -;
#define THREADBEGIN(var) if(var == ThreadHanle){return;} /*
#include "ThreadPool.h"
mutex m; void func(int threadID)
{
while (true)
{
THREADBEGIN(threadID);
std::lock_guard<mutex> lg(m);
static int time = GetTickCount();
static int index = 0;
if (GetTickCount() - time >= 1000)
{
std::cout << index <<" threadNum: "<< threadID << std::endl;
time = GetTickCount();
index++;
}
}
} int Main()
{ system("color 2"); ThreadPool<shared_ptr<thread>> T;
int count = 5;
for (int i = 0; i < count; i++)
{
shared_ptr<thread> ptrT(new thread(func, i)); T.addChild(std::move(ptrT));
} std::cout << "线程初始完毕!" << std::endl; T.stop(); system("pause");
return 0;
}
*/ using namespace std;
template<typename PTRTHREAD>
class ThreadPool:public thread
{
vector<shared_ptr<thread>> *m_vThread = nullptr;
public:
ThreadPool();
ThreadPool(PTRTHREAD Thread);
~ThreadPool(); //返回当前这个线程的位置,不是ID
int addChild(PTRTHREAD Thread);
//停止一个线程
void stop(THREADHANDLE ThreadID);
//停止所有线程
void stop();
private:
//void start();
}; template<typename PTRTHREAD>
inline ThreadPool<PTRTHREAD>::ThreadPool()
{
m_vThread = new vector<shared_ptr<thread>>();
} //没有join()
template<typename PTRTHREAD>
inline ThreadPool<PTRTHREAD>::ThreadPool(PTRTHREAD Template)
{
m_vThread = new vector<shared_ptr<thread>>();
m_vThread->push_back(Template);
/*
下面他妈两种方法都可以
由于继承了thread 所以可以访问get()这个受保护的函数
*/
//m_vThread[0].begin()->get()->join();
//m_vThread->begin()->get()->join();
} template<typename PTRTHREAD>
inline ThreadPool<PTRTHREAD>::~ThreadPool()
{
if (m_vThread != nullptr)
{
for (vector<shared_ptr<thread>>::iterator i = this->m_vThread->begin(); i != this->m_vThread->end(); i++)
{
//如果智能指针不为empty
if ((*i))
{
bool ret = i->get()->joinable();
//如果可以join()
if (ret)
{
i->get()->join();
}
i->reset();
}
}
m_vThread->clear();
delete m_vThread;
m_vThread = nullptr;
}
} template<typename PTRTHREAD>
int ThreadPool<PTRTHREAD>::addChild(PTRTHREAD ptrThread)
{
this->m_vThread->push_back(ptrThread);
int ret = this->m_vThread->size() - ;
return ret;
} template<typename PTRTHREAD>
void ThreadPool<PTRTHREAD>::stop(THREADHANDLE ThreadID)
{
if (!this->m_vThread->empty())
{
int i = ;
for (vector<shared_ptr<thread>>::iterator it = this->m_vThread->begin(); it != this->m_vThread->end(); it++,i++)
{
if (i == ThreadID)
{
if ((*it))
{
ThreadHanle = ThreadID;
bool ret = it->get()->joinable();
if (ret)
{
it->get()->join();
printf("成功结束线程 <ID = %d> ......\n",ThreadID);
}
it->reset();
it = this->m_vThread->erase(it);
//直接return 就不用else
return;
}
}
//else
//{
// it++;
// i++;
//}
}
}
} template<typename PTRTHREAD>
void ThreadPool<PTRTHREAD>::stop()
{
if (!this->m_vThread->empty())
{
int i = ;
for (vector<shared_ptr<thread>>::iterator it = this->m_vThread->begin(); it != this->m_vThread->end(); )
{
if ((*it))
{
ThreadHanle = i;
bool ret = it->get()->joinable();
if (ret)
{
it->get()->join();
printf("成功结束线程 <ID = %d> ......\n", ThreadHanle);
it->reset();
it = this->m_vThread->erase(it);
i++;
}
else
{
it++, i++;
}
}
}
}
} #endif // !__THREADPOOL_H__
}
C/C++ 智能指针线程池的更多相关文章
- boost的线程池和内存池 智能指针
内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- ndk学习之c++语言基础复习----C++线程与智能指针
线程 线程,有时被称为轻量进程,是程序执行的最小单元. C++11线程: 我们知道平常谈C++线程相关的东东基本都是基于之后要学习的posix相关的,其实在C++11有自己新式创建线程的方法,所以先来 ...
- Smart Thread Pool (智能线程池)
STPStartInfo stp = new STPStartInfo(); stp.DisposeOfStateObjects = true; stp.CallToPostExecute = ...
- 【STL学习】智能指针之shared_ptr
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
- 基于C++11的线程池,简洁且可以带任意多的参数
咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...
- c++11线程池实现
咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ...
- 基于C++11的线程池(threadpool),简洁且可以带任意多的参数
咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
随机推荐
- 目标检测中roi的有关操作
1.roi pooling 将从rpn中得到的不同Proposal大小变为fixed_length output, 也就是将roi区域的卷积特征拆分成为H*W个网格,对每个网格进行maxpooling ...
- php递归无限分类、根据子类获取所有顶类
//递归无限分类树 public static function diGui($data, $pid) { $arr = collect([]); if (empty($data)) { return ...
- Devops、CI\CD、Jenkins
Devops DevOps对应用程序发布的影响 在很多企业中,应用程序发布是一项涉及多个团队.压力很大.风险很高的活动.然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下 [2] : ...
- SQL Server 管理套件(SSMS)
SQL Server 管理套件(SSMS) 当您按照之前章节的步骤顺利安装完 SQL Server 2014 后,要做的第一件事就是需要打开 SQL Server 管理套件,并且要知道怎样去使用它. ...
- TableStore最佳实践:GEO索引打造店铺搜索系统
摘要: 如何使用TableStore打造店铺搜索系统 一.方案背景 对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力:一方面,存储服务需要应对海量数据的低延迟存.读,另一方面,存储 ...
- vue中使用iview表单验证时this指针问题
需求 使用iview,在提交时对值b进行验证,使其不能大于值a 实现 <Form ref="config" :model="config" :rules= ...
- mysql完美增量备份脚本
是否因为mysql太大,来回备份浪费资源带宽而发愁,如果想解决这个麻烦就需要增量备份. vi /etc/my.cnf开启日志及定期清理日志log-bin=mysql-binbinlog_format= ...
- MyBatis简介与配置
1.1MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XM ...
- 栈Stack --- 数组实现
栈最大的一个特点就是先进后出(FILO—First-In/Last-Out). /** * 栈:后进先出 * Created by fred on 2018/7/31. */ public class ...
- HTML-参考手册: 功能排序
ylbtech-HTML-参考手册: 功能排序 1.返回顶部 1. 功能排序 New : HTML5 新标签 标签 描述 基础 <!DOCTYPE> 定义文档类型. <html ...