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 ...
随机推荐
- 重学JavaScript - 映射与集合
作者:狐狸家的鱼 GitHub:surRimn 整理自MDN文档 带键的集合 映射 Map对象 一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返 ...
- shell 根据路径获取文件名和目录
path=/dir1/dir2/dir3/test.txt echo ${path##*/} 获取文件名 test.txtecho ${path##*.} 获取后缀 txt #不带后缀的文件名temp ...
- POJ 3159 Candies(spfa、差分约束)
Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...
- 洛谷P2015 二叉苹果树(树状dp)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- [CSP-S模拟测试]:金(king)(高精度+模拟)
题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...
- [六省联考2017]分手是祝愿 题解(期望dp)
题目描述 B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数. 每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示 ...
- getjob
[op@TIM getpage]$ cat job.py #coding: utf- #title..href... import urllib.request import time url=[ p ...
- ES6 基础内容介绍
参考博客: https://www.cnblogs.com/libin-1/p/6716470.html 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性 ...
- java 重新学习 (三)
一.静态初始化块和声明静态成员变量时所指定的初始化值都是该类的初始化代码,他们的执行顺序与源程序中的排列顺序相同. static int a = 9 ; static{ a = 6; } public ...
- 关于char(M)和varchar(N)的区别
1.int(10)的10表示显示的数据的长度,不是存储数据的大小:chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符. int(10) 10位的数据长度 9999 ...