使用Windows API函数来创建线程池,可以极大的方便了自己编写线程池的繁琐步骤。

使用CreateThreadPool来创建一个线程池,需要在创建完成后,初始化线程池的状态,并且在不需要的时候清理线程池所占用的资源。

相关代码:

    auto m_ptp_pool = CreateThreadpool(NULL);            // 创建线程池
SetThreadpoolThreadMaximum(m_ptp_pool, 12);
SetThreadpoolThreadMinimum(m_ptp_pool, 1);
InitializeThreadpoolEnvironment(&m_tp_callback_environ);

以上代码第一行表示,1.我们创建一个线程池,2.设置线程池的最大个数,3.设置线程池的最小个数,4.设置线程池的环境资源对象

在满足以上条件后我们就可以将我们的任务添加到线程池中进行运行。线程池的函数要求必须是一个全局变量。

线程池任务函数要求规格:

typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(
_Inout_ PTP_CALLBACK_INSTANCE Instance,
_Inout_opt_ PVOID Context
);

将任务添加到线程池:

if(TrySubmitThreadpoolCallback(func, this, &m_tp_callback_environ)==0)
m_box.InsertString(0, TEXT("线程失败!"));

func函数示例:

void func(PTP_CALLBACK_INSTANCE a, LPVOID args) {
CMyMfcSdiView* obj = (CMyMfcSdiView*)args; // 由于我的测试是在MFC下使用的,故采用MFC对象进行显示,但是不影响线程池的使用
obj->m_box.InsertString(0, TEXT("线程写入"));
}

使用TrySubmitThreadpoolCallback函数将任务添加到创建好的线程池,并且线程立即执行。可以多次调用该函数将需要的任务添加到线程池中执行。

如果我们不再需要线程池,需要将线程池的环境资源对象释放,并且关闭线程池句柄,来优化系统资源。

    DestroyThreadpoolEnvironment(&m_tp_callback_environ);
CloseThreadpool(m_ptp_pool);

至此,一个线程池的创建,使用,销毁就结束了,至于API函数的参数类型,可以参考在键入api函数时参考参数提示

或者参考以下两个变量,在上述代码中用到:

   PTP_POOL m_ptp_pool;
TP_CALLBACK_ENVIRON m_tp_callback_environ;

以上测试用例在VS2022中运行,如果您有什么问题,欢迎提问

使用CreateThreadPool创建线程池的更多相关文章

  1. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  2. Python并发编程之消息队列补充及如何创建线程池(六)

    大家好,并发编程 进入第六篇. 在第四章,讲消息通信时,我们学到了Queue消息队列的一些基本使用.昨天我在准备如何创建线程池这一章节的时候,发现对Queue消息队列的讲解有一些遗漏的知识点,而这些知 ...

  3. Executors创建线程池的几种方式以及使用

    Java通过Executors提供四种线程池,分别为:   1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.   ...

  4. java线程池之一:创建线程池的方法

    在Java开发过程中经常需要用到线程,为了减少资源的开销,提高系统性能,Java提供了线程池,即事先创建好线程,如果需要使用从池中取即可,Java中创建线程池有以下的方式, 1.使用ThreadPoo ...

  5. 你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池

    你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池. 否则,如果只用一个线程池的话,不管是iO密集的线程,或者cpu消耗大的都放在同一个线程池的话,会发生线程池被撑满的情况

  6. 【搞定面试官】你还在用Executors来创建线程池?会有什么问题呢?

    前言 上文我们介绍了JDK中的线程池框架Executor.我们知道,只要需要创建线程的情况下,即使是在单线程模式下,我们也要尽量使用Executor.即: ExecutorService fixedT ...

  7. 使用Runnable接口创建线程池

    步骤: 创建线程池对象创建 Runnable 接口子类对象提交 Runnable 接口子类对象关闭线程池实例: class TaskRunnable implements Runnable{ @Ove ...

  8. 为什么阿里巴巴要禁用Executors创建线程池?

    作者:何甜甜在吗 juejin.im/post/5dc41c165188257bad4d9e69 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadP ...

  9. 为什么尽量不要使用Executors创建线程池

    看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过源码分析禁用的原因. 线程池的优点 管理一组工作线程,通过线程池 ...

随机推荐

  1. 漫长的旅途--C++primer学习-命名空间以及类的自动转换和强制转换

    C++用名称空间来控制名称的作用域: 1不同命名空间的同名变量可以同时存在,不会发生冲突 2命名空间不能出现在代码块中 3我们用作用域运算符::,使用空间名来限定名称,最常用的std::cout 4u ...

  2. Linux下使用压力测试工具stress

    一:stress的安装 首先解压安装包到/usr/local/src/下 mv stress-1.0.4.tar.gz /usr/local/src​tar -zxf stress-1.0.4.tar ...

  3. win10关于后缀名无法关联相应程序默认打开方式的处理方法

    系统:win10 专业版 现象:以".chm"文件为例,每次都要重新选择一次打开方式才能打开chm文件,无法设置默认打开方式. 解决方法: 1.win+r打开运行,输入regedi ...

  4. kafka 学习(二--前言)

    kafka 现在在企业应用和互联网项目中的应用越来越多了,本篇文章就从 kafka 的基础开始带你一展 kafka 的宏图 1. 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 ...

  5. 比较一下 Java 和 JavaSciprt?

    JavaScript 与 Java 是两个公司开发的不同的两个产品.Java 是原 Sun Microsystems 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序 开发:而 JavaSc ...

  6. kafka partiton迁移方法与原理

    在kafka中增加新的节点后,数据是不会自动迁移到新的节点上的,需要我们手动将数据迁移(或者成为打散)到新的节点上 1 迁移方法 kafka为我们提供了用于数据迁移的脚本.我们可以用这些脚本完成数据的 ...

  7. spring 支持哪些 ORM 框架 ?

    Hibernate iBatis JPA JDO OJB

  8. 为什么要用Spring

    1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户不必再为单实例模式类.属性文件解析 ...

  9. 在 VC 下清空键盘缓冲区的方法

    控制台窗口是有输入缓冲区的,当你按键后程序没有来得及处理,系统会将按键缓存,等到程序获取按键的时候,系统会把缓冲区里面之前的按键返回. // 调用控制台 API,清空之前缓冲区内的所有按键. Flus ...

  10. 从零开始画自己的DAG作业依赖图(四)--节点连线优化版

    概述 上个版本简单的连线在一些复杂场景,尤其层级比较多,连线跨层级比较多的情况下,会出现线条会穿过矩形的情况,这一讲就是在这个基础上,去优化这个连线. 场景分析 在下面几种情况下,简单版本的画法已经没 ...