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)


相关推荐

  • Linux文件锁

    Linux文件锁翻阅参考资料,你会发现文件锁可以进行很多的分类,最常见的主要有读锁与写锁,前者也叫共享锁,后者也叫排斥锁,值得注意的是,多个读锁之间是不会相互干扰的,多个进程可以在同一时刻对同一个文件加读锁;但是,如果已经有一个进程对该文件加了写锁,那么其他进程则不能对该文件加读锁或者写锁,直到这个进程将写锁释放,因此可以总结为:对于同一个文件而言,它可以同时拥有多个读者,但是在某一时刻,他只能拥有一个写者。

  • DEDECMS中的几个常见的自定义常量DEDEMEMBER等位置

    DEDECMS中的几个常见的自定义常量DEDEMEMBER等位置

  • vue页面刷新_vue强制重置组件

    vue页面刷新_vue强制重置组件vue页面刷新首先我们都知道vue属于单页面应用,默认境况下是不会触发刷新页面操作的,所以这个时候就需要我们通过事件来触发reload()来达到刷新操作接下来我就为大家介绍三种刷新页面的方法1.wiindow.location.reload([bForceGet])该方法强迫浏览器刷新当前页面bForceGet可选参数,默认为false,从客户端缓存里取当前true,则以get方式,从服务器端获取最新的页面,相当于页面f5刷新wiindow.location.replace(URL)

    2022年10月16日
  • acwing1072. 树的最长路径(树形dp)

    acwing1072. 树的最长路径(树形dp)给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一条路径,使得使得路径两端的点的距离最远。注意:路径中可以只包含一个点。输入格式第一行包含整数 n。接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示树的最长路径的长度。数据范围1≤n≤10000,1≤ai,bi≤n,−105≤ci≤105输入样例:65 1

  • MariaDB[通俗易懂]

    MariaDB[通俗易懂]MariaDB

  • Linux守护进程的编程实现

    Linux守护进程的编程实现

发表回复

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

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