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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据专业学什么,应该学习什么语言

    大数据专业学什么,应该学习什么语言大数据(bigdata),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。目前,

    2022年8月6日
    5
  • Java中IO流-21-图片加密简单实现

    Java中IO流-21-图片加密简单实现     这篇我们利用流来处理图片加密,当然这里没有处理到打开图片,提示输入密码的这么好友好效果。图片加密,也是把一个图片字节读取,然后进行加密运算,最后拷贝成新的图片文件。简单来说,这个过程原理就是,一个数如何被同一个数异或两次,那么结果就等于这个数本身。第一次进行异或就是图片加密过程,给图片每一个字节都进行加密,第二次异或就是解密过程。1.图片加密过程packageio;im…

    2022年6月21日
    39
  • Quartz使用之:远程job的执行

    Quartz使用之:远程job的执行quartz提供了远程执行job的功能。本篇文章通过具体的例子来演示这一功能。第一步:建立以下几个文件:1.RemoteJob.java(远程要执行的任务,实现了Job接口)。2.RemoteClientLab.java(客户端程序,远程告诉Scheduler去执行一个任务)。3.client.properties(客户端属性文件)4.Rem

    2022年7月14日
    19
  • svm实现手写数字识别_数字识别

    svm实现手写数字识别_数字识别老师常说,在人工智能未发展起来之前,SVM技术是一统江湖的,SVM常常听到,但究竟是什么呢?最近研究了一下基于SVM技术的手写数字识别。你没有看错,又是手写数字识别,就是喜欢这个手写数字识别,没办法(¬∀¬)σ一、背景1.手写数字识别技术的含义2.手写数字识别技术的理论价值3.数字识别技术的难点二、SVM技术1.SVM方法简介2.线性可划分问题3.近似线性可分问题…

    2022年9月14日
    3
  • python中一次替换字符串中的多个字符[通俗易懂]

    python中一次替换字符串中的多个字符[通俗易懂]知识传送门:正则表达式先直接上解决方案:比如下面给出的字符串a,有字母、’(单引号)、\n(换行符)、数字、:(冒号)、,(逗号),目标是只保留字符串中的数字和字母,且看我如何操作。importrea=’eew\’eawr,2fd\nsa:21’b=re.sub(r'[\’:\s,]*’,”,a)#前面是正则表达式,匹配多种字符(串)print(b)…

    2022年6月7日
    105
  • 分布式CAP原理:一致性、可用性、分区容错

    分布式CAP原理:一致性、可用性、分区容错CAP概念单机系统由于所有的处理都在单机完成的,所以不存在数据一致性问题,但是如果系统崩溃了,就导致服务不可用。分布式系统可以实现服务的高可用,现有的大型网站几乎都是分布式的,特别是微服务的出现,使得分布式系统正变得越来越重要。分布式系统最大的难点,就是各个节点的状态如何同步。CAP原理给分布式系统的实现带来了指导思路,它也是理解分布式系统的重要理论。CAP由以下三个指标组成:C(Consistency):一致性A(Availability):可用性P(P…

    2022年7月25日
    6

发表回复

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

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