本文主要是介绍windows2000提供了如下几种线程池函数用于线程管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
windows2000提供了如下几种线程池函数用于线程管理 收藏
windows2000提供了如下几种线程池函数用于线程管理:
一、异步调用函数:
BOOL QueueUserWorkItem(
PTHREAD_START_ROUTINE pfnCallback,
PVOID pvContext,
ULONG dwFlags);
该函数将“工作项目”放入线程池并且立即返回。工作项目是指一个用pfnCallback参数标识的函数。它被调用并且传递单个参数pvContext.工作项目函数原型如下:
DWORD WINAPI WorkItemFunc(PVOID pvContext);
dwFlags参数:WT_EXECUTEDEFAULT 工作项目放入非I/O组件得线程中
WT_EXECUTEINIOTHREAD 工作项目放入I/O组件的线程中,这样的线程在I/O请求没有完成之前不会被终止运行 ,防止因为线程被终止导致I/O请求丢失。
WT_EXECUTEINPERSISTENTTHREAD 放入永久线程池,
WT_EXECUTELONGFUNCTION 工作项目需要长时间的工作,系统会据此安排更多的线程。
线程池不能设置线程个数的上限,否则排队个数超过线程个数上限的时候,会导致所有的线程都被中断。
工作项目函数如果访问了已经被卸载的DLL,会产生违规访问。
二、按规定的时间间隔调用函数
创建定时器队列:
HANDLE CreateTimerQueue();
在队列中创建定时器:
BOOL CreateTimerQueueTimer(
PHANDLE phNewTimer,
HANDLE hTimerQueue,
WAITORTIMERCALLBACK pfnCallback,
PVOID pvContext,
DWORD dwDueTime,
DWORD dwPeriod,
ULONG dwFlags);
工作回调函数原型如下:
VOID WINAPI WaitOrTimerCallback(
PVOID pvContext,
BOOL fTimerOrWaitFired);
dwFlags比前面的多了一个标志:WT_EXECUTEINTIMERTHREAD,表示由组件的定时器线程(定时器组件只有一个线程)运行这个
工作函数,此时的工作函数必须是很快返回的,否则定时器组件将无法处理其他的请求。
删除定时器:
BOOL DeleteTimerQueueTimer(
HANDLE hTimerQueue,
HANDLE hTimer,
HANDLE hCompletionEvent);
在定时器线程中删除定时器会造成死锁。设定hCompletionEvent为INVALID_HANDLE_VALUE,那么在定时器的所有排队工作项目没有完成之前,DeleteTimerQueueTimer不会返回,也就是说在工作项目中对定时器进行中断删除会死锁。可以给hCompletionEvent传递事件句柄,函数会立即返回,在排队工作完成之后,会设置该事件。
重新设定定时器://不能修改已经触发的单步定时器。
BOOL ChangeTimerQueueTimer(
HANDLE hTimerQueue,
HANDLE hTimer,
ULONG dwDueTime,
ULONG dwPeriod;
删除定时器队列:
BOOL DeleteTimerQueueEx(
HANDLE hTimerQueue,
HANDLE hCompletionEvent);
三、当单个内核对象变为已通知状态时调用函数
BOOL RegisterWaitForSIngleObject(
PHANDLE phNewWaitObject,
HANDLE hObject,
WAITORTIMERCALLBACK pfnCallback,
PVOID pvContext,
ULONG dwMilliseconds,
ULONG dwFlags);
pfnCallBack原型:
VOID WINAPI WaitOrTimerCallbadkFunc(
PVOID pvContext,
BOOLEAN fTimerorWaitFired);
如果等待超时,fTimerorWaitFired==TRUE,如果是已通知状态,则为FALSE.
dwFlags可以传递参数:WT_EXECUTEINWAITTHREAD,它让等待组件得线程之一运行工作项目函数。注意项同前。
如果等待的内核对象是自动重置的,那么会导致工作函数被反复调用,传递WT_EXECUTEONLYONCE会避免这种情况。
取消等待组件的注册状态:
BOOL UnregisterWaitEx(
HANDLE hWaitHandle,
HANDLE hCompletionEvent);
四、当异步I/O请求完成时调用函数
将设备和线程池的非I/O组件关联
BOOL BindIoCompletionCallback(
HANDLE hDevice,
POVERLAPPED_COMPLETION_ROUTINE pfnCallback,
ULONG dwFlags//始终为0);
工作函数原型:
VOID WINAPI OverlappedCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransferred,
,
POVERLAPPED pOverlapped);
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zkprh418/archive/2009/10/09/4644619.aspx
这篇关于windows2000提供了如下几种线程池函数用于线程管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!