标签:
第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