第11章 Windows线程池(1)_传统的Windows线程池

第11章 Windows线程池

11.1 传统的Windows线程池及API

11.1.1 传统的线程池对象及对应的API


线程池对象


API


普通任务线程池


QueueUserWorkItem


计时器线程池


CreateTimerQueue(创建线程池)


CreateTimerQueueTimer(创建计时器)


ChangeTimerQueueTimer


DeleteTimerQueueTimer


DeteTimerQueueEx


同步对象等待线程池


RegisterWaitForSingleObject


UnregisterWaitEx


完成端口线程池


BindIoCompletionCallback

11.1.2 普通任务线程池

(1)QueueUserWorkItem函数


参数


描述


LPTHREAD_START_ROUTINE

pfnCallback


工作项,即要排队到线程池中的回调函数(类似于线程函数),原型声明为

DWORD WINAPI ThreadProc(LPVOID lpParameter);


PVOID Context


要传给线程函数的额外数据


ULONG Flags


用于指明线程池中的线程在什么条件下调用这个回调函数

①WT_EXECUTEDEFAULT:普通线程不可警告状态下运行。

②WT_EXECUTEINIOTHREAD:以IO可警告状态运行线程回调函数。

③WT_EXECUTEINPERSISTENTTHREAD:该线程一直运行而不会终止。

④WT_EXECUTELONGFUNCTION:执行一个运行时间较长的任务(这会使系统考虑是否在线程池中创建新的线程)。

⑤WT_TRANSFER_IMPERSONATION:以当前的访问令牌运行线程并回调函数


备注:CreateThread函数与QueueUserWorkItem函数要求的线程函数的原型一致。因此可以方便的将一个线程函数创建为线程或线程池的线程池回调函数。

【QueueUserWorkItem示例程序】

#include <windows.h>
#include <locale.h>
#include <tchar.h>
#include <strsafe.h>

#define BEGINTHREAD(Fun,Param)  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun,Param,0,NULL);

DWORD WINAPI ThreadProc(LPVOID lpParameter);

int _tmain()
{
    _tsetlocale(LC_ALL, _T("chs"));
    int iWaitLen = 0;

    do{
        _tprintf(_T("请输入一个等待的时间常量,单位秒(输入0退出):"));
        _tscanf_s(_T("%i"), &iWaitLen);
        if (iWaitLen>0){
            //下面的代码演示了,使用CreateThread和QueueUserWorkItem,实际效果
            //是一样的,当然线程不多的情况下如此,如果线程很多时一定要使用QueueUserWorkItem
            QueueUserWorkItem(ThreadProc, (PVOID)iWaitLen, WT_EXECUTELONGFUNCTION);

            //显示使用CreateThread来创建多个线程的效果
            //BEGINTHREAD(ThreadProc, (LPVOID)iWaitLen);
        }

    } while (iWaitLen);

    return 0;
}

//该函数可以由CreateThread的线程启动,也可以使用QueueUserWorkItem线程池中的线程启动
DWORD WINAPI ThreadProc(LPVOID lpParameter){
    int iWaitLen = (int)lpParameter;
    _tprintf(_T("\n线程[ID:0x%X]将等待%u秒..."), GetCurrentThreadId(), iWaitLen);
    Sleep(iWaitLen * 1000);
    _tprintf(_T("\n线程[ID:0x%X]将等待结束!\n"), GetCurrentThreadId(), iWaitLen);
    return 0;
}
时间: 2025-01-01 05:56:09

第11章 Windows线程池(1)_传统的Windows线程池的相关文章

第11章进程间通信(1)_管道

1. 进程间通信概述 (1)概述 ①数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间. ②共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. ③通知事件:一个进程需要向另一个(组)进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程). ④资源共享:多个进程之间共享同样的资源.为了做到这一点,需要内核提供锁和同步机制. ⑤进程控制:有些进程希望完全控制另一个进程的执行(如Degub进程),此时控制进程希望能够拦截另

第11章 Windows线程池(3)_私有的线程池

11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThreadpoolWait或CreateThreadpoolIo,并使传入参数PTP_CALLBACK_ENVIRON设为NULL时,那么所有的工作项将被添加到进程默认的线程池.一般这个默认的线程池能满足大多数应用程序的要求.其生命期与进程相同,在进程终止的时候,Windows负责线程池的清理和销毁工作. (

《Android开发艺术探索》第11章 Android的线程和线程池

第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式.(2)在Android中除了Thread,还有HandlerThread.AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不

第11章 Android的线程和线程池

常见的线程形态 AsyncTask:不适合特别耗时的后台任务,耗时使用线程池. 必须在主线程中加载. Android3.0以后是串行执行的,3.0以前是并行. HanderThread:继承了Thread,是一种可以使用Handler的Thread,和普通的Thread的区别是在run方法中可通过Looper.prepare创建消息队列. 并通过Looper.loop()来开启消息循环. IntentService:抽象类,适合执行高优先级 后台任务. 每执行一个后台任务就必须启动一次Inten

PoEdu - Windows阶段班 【Po学校】Lesson006_线程_线程的启动到消亡 &amp;线程状态 &amp; 线程安全 &amp; CONTEXT结构体 &amp; 令牌锁

011_线程启动到死亡的详细讲解 1. 线程内核对象 使用计数 2 ##决定当前线程何时销毁 暂停计数 1 ##UINT类型初始为1,可以暂停多次,如置为0则取消暂停. 退出代码 STILL_ACTIVE Signaled FALSE CONTEXT 为空 2. 栈##在隶属于当前进程的空间中,分配一块"栈"空间,以供线程使用 参数 lpParam 入口地址 lpfnAddr 3. CONTEXT##线程上一次运行时的寄存器 IP(指令寄存器) void RtlUserThreadSt

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现

JDK1.5之后提供的 Execituors生产线程池的工厂类 线程池的接口类:ExecutorService 1创建线程池的工厂类 创建类实现Runnable接口,重写里面的run方法 传递线程池任务,执行 线程池里一共就两个线程 销毁线程池 线程池销毁后 程序自动停止 线程池毁后再来执行线程任务就会报错. 原文地址:https://www.cnblogs.com/wangjunwei/p/11261573.html

《Unix环境高级编程》读书笔记 第11章-线程

1. 引言 了解如何使用多个控制线程在单进程环境中执行多个任务. 不管在什么情况下,只要单个资源需要在多个用户键共享,就必须处理一致性问题. 2. 线程概念 典型的Unix进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情. 多线程带来的好处: 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码.每个线程在进行事件处理时可以采用同步编程模式. 多个进程必须使用操作系统提供的复制机制才能实现内存和文件描述符的共享.而多个线程自动地可以访问相同的存储空间和文件描述符. 有些

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

第11章 进程与多线程

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav