C++创建线程池_windows线程池iocp

C++创建线程池_windows线程池iocp1、线程池基类负责创建线程和释放线程,ThreadPoolBase类示例代码如下:#pragmaonce#include”stdafx.h”#include<thread>#include<vector>usingnamespacestd;classCThreadPoolBase{public: CThreadPoolBase(); ~CThreadPoolBase(); virtualboolStartThread(intnTh.


Jetbrains全系列IDE稳定放心使用

c++简单线程池实现

线程池,简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他的任务使用,当线程池中的线程都在处理任务时,就没有空闲线程供使用,此时,若有新的任务产生,只能等待线程池中有线程结束任务空闲才能执行。

我们为什么要使用线程池呢?

简单来说就是线程本身存在开销,我们利用多线程来进行任务处理,单线程也不能滥用,无止禁的开新线程会给系统产生大量消耗,而线程本来就是可重用的资源,不需要每次使用时都进行初始化,因此可以采用有限的线程个数处理无限的任务。

线程池适合场合:

事实上,线程池并不是万能的。它有其特定的使用场合。线程池致力于减少线程本身的开销对应用所产生的影响,这是有前提的,前提就是线程本身开销与线程执行任务相比不可忽略。如果线程本身的开销相对于线程任务执行开销而言是可以忽略不计的,那么此时线程池所带来的好处是不明显的,比如对于FTP服务器以及Telnet服务器,通常传送文件的时间较长,开销较大,那么此时,我们采用线程池未必是理想的方法,我们可以选择“即时创建,即时销毁”的策略。

总之线程池通常适合下面的几个场合:

(1) 单位时间内处理任务频繁而且任务处理时间短

(2) 对实时性要求较高。如果接受到任务后在创建线程,可能满足不了实时要求,因此必须采用线程池进行预创建。

(3) 必须经常面对高突发性事件,比如Web服务器,如果有足球转播,则服务器将产生巨大的冲击。此时如果采取传统方法,则必须不停的大量产生线程,销毁线程。此时采用动态线程池可以避免这种情况的发生。

 1、线程池基类负责创建线程和释放线程,ThreadPoolBase类示例代码如下:

#pragma once
#include "stdafx.h"
#include <thread>
#include <vector>

using namespace std;

class CThreadPoolBase
{
public:
	CThreadPoolBase();
	~CThreadPoolBase();

	virtual bool StartThread(int nThreadCount);

	virtual void StopThread();

protected:
	virtual void Run(){};
	static DWORD WINAPI ThreadFunc(LPVOID p);

protected:
	bool m_bThreadRun;

private:
	vector<HANDLE> m_vecThread;
};

#include "stdafx.h"
#include "ThreadPoolBase.h"


CThreadPoolBase::CThreadPoolBase()
{
}

CThreadPoolBase::~CThreadPoolBase()
{
}

DWORD WINAPI CThreadPoolBase::ThreadFunc(LPVOID p)
{
	CThreadPoolBase* pThread = (CThreadPoolBase*)p;
	pThread->Run();
	return 0;
}

bool CThreadPoolBase::StartThread(int nThreadCount)
{
	bool bRet = true;
	for (int i = 0; i < nThreadCount; i++)
	{
		m_bThreadRun = true;
		HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, this, 0, NULL); // 创建线程
		if (hThread == INVALID_HANDLE_VALUE)
			bRet = false;
		else
			m_vecThread.push_back(hThread);
	}

	return bRet;
}

void CThreadPoolBase::StopThread()
{
	m_bThreadRun = false;
	for (int i = 0; i < m_vecThread.size(); i++)
	{
		//::WaitForSingleObject(m_hThread, 3000);
		::CloseHandle(m_vecThread[i]);
	}
}

 2、线程处理类继承与线程池基类,执行相应逻辑,示例代码如下:

#pragma once
#include "ThreadPoolBase.h"


class CTestThread1 : public CThreadPoolBase
{
public:
	~CTestThread1();

	// 开启处理线程
	virtual bool StartThread(int nThreadCount);

	// 关闭处理线程
	virtual void StopThread();


protected:
	CTestThread1();

	// 线程处理函数
	virtual void Run();

};

#include "stdafx.h"
#include "TestThread1.h"


CTestThread1::CTestThread1()
{
}

CTestThread1::~CTestThread1()
{
}

bool CTestThread1::StartThread(int nThreadCount)
{
	CThreadPoolBase::StartThread(nThreadCount);

	// 处理逻辑...
	// 初始化建立异步通信,收到消息后放入队列

	return true;
}

void CTestThread1::StopThread()
{
	CThreadPoolBase::StopThread();

	// 处理逻辑...
	// 关闭异步通信
}

void CTestThread1::Run()
{
	while (m_bThreadRun)
	{
		// 处理逻辑...
		// 监控消息队列中是否有待处理消息,有则处理
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187277.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • selenium自动化测试实战基于python_初级java工程师要求

    selenium自动化测试实战基于python_初级java工程师要求一、Selenium介绍Selenium是什么?一句话,自动化测试工具。它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面式浏览器,如果你在这些浏览器里面安装一个Selenium的插件,那么便可以方便地实现Web界面的测试。Selenium2,又名WebDriver,它的主要新功能是集成了Selenium1.0以及WebDriver(WebDr…

    2022年10月4日
  • PAT乙级考后杂谈

    PAT乙级考后杂谈上周末去隔壁大学参加了PAT乙级的考试,结果没想到第一次考试就出了点小问题…本来考试是在1.30全国各个考点都同时开始(因为要排名),结果快到1.30的时候机房连不上网络,最后我们这个考点直接移后到将近2.30才开始考试,虽然结束时间也移后了,不过这多年不遇的突发情况直接让我遇到也太真实了。。。小插曲过后,再说下考试内容,乙级确实难度不大,三小时五道题,前两道题基本是送分题,虽然作者本人比较菜…

    2022年4月30日
  • hdu 4944 FSF’s game(数论)

    hdu 4944 FSF’s game(数论)

    2022年1月1日
  • psm倾向得分匹配法举例_【计量地图】倾向得分匹配法(PSM)理论、操作与案例…[通俗易懂]

    这个方法的难点在于:首先,要明白反事实框架是一个什么样的东西?为什么一般把参与项目和不参与项目进行对比时会出现选择偏误?其次,搞清楚上面的原理之后,PSM真正难的是找到合适的协变量和完成两个苛刻的检验(共同支撑检验和平衡性检验)这篇文章我想达到哪些学习目标:(1)尽量汇集我看过的有用的资料(2)展示一个PSM分析的理论框架(3)针对难点说一下模型的调整问题(协变量选择、两个检验的调整)主要框架:1…

    2022年4月12日
  • js二维码生成

    详细介绍可以查看API网站:http://code.ciaoca.com/javascript/qrcode/ (前端开发仓库)一、引入js文件&amp;lt;!– 第一步:引进js文件 –&amp;gt; &amp;lt;script type=”text/javascript” src=”js/jquery.min.js”&amp;gt; \ &amp;lt;script type=”text/java…

    2021年11月30日
  • 几种开源分词工具的比較

    几种开源分词工具的比較

    2021年11月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号