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 ...
随机推荐
- 在windows下使用secure crt传文件到linux的主目录下
SECURT CRT上传文件 使用secure crt连接到Linux上 通过alt+p打开sftp服务 使用put D:\视觉\代码\ch.10.zip 即可传输完成 进入linux直接在主目录下可 ...
- python3 实现堡垒机功能(并发执行命令及上传下载文件)
转载请注明出处,欢迎提出宝贵意见,谢谢! 功能介绍: 1.主机分组 登录后显示分组主机及主机数量 选择主机组后显示该主机组下所有主机信息,主机名及IP显示输入选择:1.执行命令利用线程并发组内所有主机 ...
- python--内置函数、匿名函数、递归调用
匿名函数 有名函数: def func1(x): print(func1) 结果: <function func1 at 0x00000000005C3E18> 匿名函数: func2=l ...
- ajaxfileupload异步上传
=====================upload.html======================= <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- POJ 3904 (莫比乌斯反演)
Stancu likes space travels but he is a poor software developer and will never be able to buy his own ...
- angularjs的select使用2
https://cnodejs.org/topic/549007b44823a0234c9e1716 myAppModule.controller('FrmController', ['$scope' ...
- 树莓派2代 B型 4核 1G内存 raspberry pi 2 model B
树莓派技术交流群:318799602 期盼已久的PI2 已经到货,Element14版,非RS版本.诚信卖家如期发货,不会像某些淘宝卖家一样,没有货还标注现货,发货时间一拖再拖. 树莓派的最新力作!! ...
- 异步编程与scrapy
https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter1/index.html https: ...
- Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解
文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...
- 28. Python编写自动化测试用例
接口文档已经提供了,requests库.unittest单元测试框架也已经介绍过,笔者相信读者朋友已经可以独立编写接口自动化测试用例了.但是有一些细节,我们需要聊一下.比如我们写登录接口测试用例,用户 ...