php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 476|回复: 0

使用CreateThreadPool创建线程池

[复制链接]

2871

主题

2881

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7285
贡献
0
注册时间
2021-4-14
最后登录
2024-9-20
在线时间
716 小时
QQ
发表于 2022-4-27 18:03:22 | 显示全部楼层 |阅读模式
使用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;

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-9-20 08:08 , Processed in 0.184633 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表