//这个线程池存在一定的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__

}

最新文章

  1. window自动任务实现数据库定时备份
  2. 表达式语言EL
  3. The 2015 China Collegiate Programming Contest L. Huatuo&#39;s Medicine hdu 5551
  4. 深度解析开发项目之 05 - 解决textField编辑之后点击其他内容改变的问题
  5. Ubuntu 13.10下Hadoop 2.2 安装、配置、编译(伪分布式)
  6. com.sun.crypto.provider.SunJCE
  7. 【nodejs】关于 alert 和 document
  8. 常用UI布局
  9. ACM——搜索(一)
  10. JQ动画事件
  11. Python新手学习基础之运算符——比较运算符
  12. 【C/C++多线程编程之九】pthread读写锁
  13. jquery 画板折叠
  14. WebService 使用wsdl.exe生成代理类
  15. 关于TOE(TCP/IP Offload Engine)
  16. 文本三剑客---gawk基础
  17. Jungle Roads(最小生成树)
  18. 【MFC】基于OpenCV的魔镜
  19. 使用foreach需要判空。
  20. Nginx多虚拟主机下泛域名配置

热门文章

  1. mybatis generator 使用方法
  2. python3.x 匿名函数lambda_扩展sort
  3. SEM推广引流效果的因素有哪些呢?
  4. MailUtils
  5. jdbc的连接数据库,使用PreparedStatement实现增删改查等接口
  6. Python基础教程(006)--Python的特点
  7. LayuiAdmin 滚动条设置问题解决
  8. 20175223 MySQL
  9. 设置 Quartus II 的仿真时间大于 1us
  10. jQuery内容过滤选择器再探究(原创)