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)
	{
		// 处理逻辑...
		// 监控消息队列中是否有待处理消息,有则处理
	}
}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • springboot整合shiro实现权限控制

    springboot整合shiro实现权限控制ApacheShiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。上个月写了一个在线教育的项目用到了shiro权限控制,这几天又复盘了一下,对其进行了深入探究,来总结一下。下面所总结的有关shiro的代码已经传到我的github上,可以访问下面的……

    2022年10月22日
  • ps图层面板详解_ps图层样式怎么使用

    ps图层面板详解_ps图层样式怎么使用原文:http://coolketang.com/staticPhotoshop/5a98d4acfe88c20038c5716f.html1.本节课程将为您演示,[样式面板]的使用。首先选择工具箱中的[横排文字工具],创建一个文字图层。 2.然后在图像的适当位置上点击,确定文字的起始位置。 3.接着输入一行文字。 4.点击选项栏右侧的[提交当前所有编辑]按钮,完成文字的输入。 5.在字…

  • python官方库和第三方库_网络爬虫第三方库

    python官方库和第三方库_网络爬虫第三方库Python的强大之处除了它的简洁易用,最厉害的就是它有着广泛的第三方库支持。今天小编就带你看下Python有哪些常用第三库吧,知道且用过超过10个的欢迎留言~文本处理与格式转换Char…

  • python中读写LMDB数据库[通俗易懂]

    python中读写LMDB数据库[通俗易懂]转自原文:https://blog.csdn.net/dcrmg/article/details/79144507LMDB的全称是LightningMemory-MappedDatabase(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件:LMDB文件可以同时由多个进程打开,具有极高的数据存取速度,访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码…

  • string 保留小数点后两位(js中保留小数点后两位)

    js保留小数点后N位的方法介绍利用toFixed函数代码如下复制代码document.write(“JS保留两位小数例子”);vara=2.1512131231231321;document.write(“原来的值:”+a+””);document.write(“两位小数点:”+a.toFixed(2)+”四位小数点”+a.toFixed(4));四舍五入的转换函数,如下:代码如下复制代码f…

  • 数仓ODS层建设_实时数仓架构

    数仓ODS层建设_实时数仓架构一、ODS层辨析ODS全称是OperationalDataStore,即操作数据存储。1.InmonVSKimballBill.Inmon的定义:ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。常常被作为数据仓库的过渡,也是数据仓库项目的可选项之一。而Kimball的定义:操作型系统的集成,用于当前、历史以及其它细节查询(业务系统的一部分);为决策支持提供当前细节数据(数据仓库的一部分)。2.ODSVSDB

发表回复

您的电子邮箱地址不会被公开。

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