//这个线程池存在一定的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++ 智能指针线程池的更多相关文章

  1. boost的线程池和内存池 智能指针

    内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...

  2. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  3. ndk学习之c++语言基础复习----C++线程与智能指针

    线程 线程,有时被称为轻量进程,是程序执行的最小单元. C++11线程: 我们知道平常谈C++线程相关的东东基本都是基于之后要学习的posix相关的,其实在C++11有自己新式创建线程的方法,所以先来 ...

  4. Smart Thread Pool (智能线程池)

    STPStartInfo stp = new STPStartInfo();   stp.DisposeOfStateObjects = true;   stp.CallToPostExecute = ...

  5. 【STL学习】智能指针之shared_ptr

    前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指 ...

  6. 基于C++11的线程池,简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...

  7. c++11线程池实现

    咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ...

  8. 基于C++11的线程池(threadpool),简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...

  9. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

随机推荐

  1. c++后台开发面试常见知识点总结(五)场景设计

    搜索引擎的实现,会用到哪些重要的数据结构 设计实现一个HTTP代理服务器 / web服务器 / FTP服务器/ 设计实现cache缓存web服务器的网页访问记录 把一个文件快速下发到100w个服务器 ...

  2. Electron-vue实战(三)— 如何在Vuex中管理Mock数据

    Electron-vue实战(三)— 如何在Vuex中管理Mock数据 作者:狐狸家的鱼 本文链接:Vuex管理Mock数据 GitHub:sueRimn 在vuex中管理mock数据 关于vuex的 ...

  3. python 控制终端执行的subprocess.getoutput函数

    devices = subprocess.getoutput('ios-deploy -c') print(devices) 如上代码中,subprocess.getoutput函数首先在终端执行命令 ...

  4. The user specified as a definer ('root'@'%') does not exist解决

    转自:https://www.cnblogs.com/hanxue53/p/5850263.html 解决方法: 2.进入mysql的安装路径之前,要确保你的mysql服务是开启的: 在DOS命令窗口 ...

  5. C#中using语句是什么意思

    使用using语句最终生成的其实是一个try, finally代码块,在finally代码块里释放资源.要求是:为 using 语句提供的对象必须实现 IDisposable 接口.此接口提供了 Di ...

  6. Python中的try-finally

    >>> try: ... raise KeyboardInterrupt ... finally: ... print('Goodbye, world!') ... Goodbye, ...

  7. mysql 获取任意一个月的所有天数。

    SELECT ADDDATE(y.first, x.d - 1) as dFROM(SELECT 1 AS d UNION ALLSELECT 2 UNION ALLSELECT 3 UNION AL ...

  8. PHP curl_reset函数

    curl_reset— 重置libcurl会话句柄的所有选项. 说明 void curl_reset ( resource $ch ) 该函数将重新初始化cURL的所有选项值(默认值). 注意:cur ...

  9. Qt的信号和槽机制

    一.信号和槽机制 信号和槽用于两个对象之间的通信,我们希望任何对象都可以和其他对象进行通信.     当一个特殊的事情发生时便可以发射一个信号,而槽就是一个函数,它在信号发射后被调用来相应这个信号.( ...

  10. 「NOI2016」区间 解题报告

    「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...