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

相关推荐

  • 写给大忙人看的 – Java中上传文件MinIO服务器(2)

    写给大忙人看的 – Java中上传文件MinIO服务器(2)上一篇写给大忙人看的-搭建文件服务器MinIO(一),我们已经成功地搭建了MinIO文件服务器,这一篇讲解在Java中如何上传文件至MinIO一、开发前戏1、项目中引入maven依赖<!–minio相关依赖–><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version

    2022年6月1日
  • js移除数组中指定元素的值_js删除数组中指定几个元素

    js移除数组中指定元素的值_js删除数组中指定几个元素首先需要找到元素的下标:vararray=[“zhangsan”,”lisi”,”wangwu”];varindex=array.indexOf(“lisi”);使用splice函数进行移除:if(index>-1){array.splice(index,1);}splice函数的第二个参数指删除的数目。splice直接修改原数组,…

    2022年10月25日
  • matlab模糊控制工具箱使用教程_模糊pid控制原理

    matlab模糊控制工具箱使用教程_模糊pid控制原理Matlab模糊控制工具箱为模糊控制器的设计提供了一种非常便捷的途径,通过它我们不需要进行复杂的模糊化、模糊推理及反模糊化运算,只需要设定相应参数,就可以很快得到我们所需要的控制器,而且修改也非常方便。下面将根据模糊控制器设计步骤,一步步利用Matlab工具箱设计模糊控制器。1、模糊控制工具箱使用首先我们在Matlab的命令窗口(commandwindow)中输入fuzzy,回车就会出来…

    2022年8月30日
  • ffmpeg的安装和使用教程_Anaconda安装ffmpeg

    ffmpeg的安装和使用教程_Anaconda安装ffmpeg一、ffmpeg的简介FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。主要参数-i——设置输入档名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文件。-fs——超过指定的文件大小时则结束转换。-t——指定…

    2022年9月12日
  • 对象数组(C++学习笔记 20)[通俗易懂]

    对象数组(C++学习笔记 20)[通俗易懂]一、对象数组的定义所谓对象数组,指每一个数组元素都是对象的数组,即若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。定义一个一维数组的格式如下:类名数组名[下标表达式]与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,其一般形式为:数组名[下标].成员名在建立数组时,同样要调用构造函数。有几个数组元…

    2022年7月12日
  • cutoff激活成功教程版下载_cutout

    cutoff激活成功教程版下载_cutout000000013F67F64|E831680500         |callcutout.13F6D5E80                  |000000013F67F64|4C8D0DCAF33C00   |lear9,qwordptrds:[13FA4EA20]        |;13FA4EA20:L”menuicon.png”

    2022年9月16日

发表回复

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

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