码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-13 17:24:38      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

第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;
}

 

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

标签:

原文地址:http://www.cnblogs.com/5iedu/p/4805188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!