线程池(翻译自MSDN)
2008-11-10 22:38
267 查看
线程池(翻译自MSDN)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在许多应用程序中,有时我们创建的线程大部分时间是在等待某个事件的发生,还有一些线程只是在一些状态信息发生改变或更新时才被周期性地唤醒。线程池,以提供给我们的应用程序一个工作线程(worker thread)的容器的方式(容器中的线程由系统管理),使得我们能够更加有效地使用线程。我们可以使用一个线程去监视线程池中所有的排队等待的操作的状态,当一个等待的操作完成,就从线程中取出一个线程运行相关的回调函数。
也可以把“工作项目”①(work item)进行排队,这些工作项目同线程池中等待的操作没有关系。把一个工作项目交给线程池中线程执行,请调用QueueUserWorkItem函数,该函数包含一个由线程池中线程调用的参数;当一个工作项目被排队后,便无法再取消。
在线程池中,还可以使用“定时器队列”(Timer-queue timers)和“注册等待消息”(registered wait operations)。它们的回调函数也被放在线程池中进行排队。还可以使用BindIoCompletionCallback函数设置一个异步I/O操作,一旦I/O完成,线程池中的一个线程将执行设置的回调函数。
调用QueueUserWorkItem 函数, BindIoCompletionCallback函数,或者,定时器队列或注册等待消息把回调函数队列化时,线程池立即被创建。线程池中线程的数量取决于可用的内存。每个线程使用默认的堆栈大小,并以默认的优先级运行。
线程池中的线程有两种类型:I/O和非I/O。I/O工作线程是一种处于报警等待状态的线程。工作项目作为异步过程调用(APC)被放到I/O工作线程进行排队。因此,如果执行一个等待报警状态的线程,需要把工作项目放到I/O工作线程进行排队。
非I/O工作线程在I/O完成端口上进行等待。使用非I/O工作线程和比I/O工作线程更有效。因此,可能的话应该尽量使用非I/O工作线程。如果存在没有处理的异步I/O请求,两种类型的线程都不会退出。两种类型的线程都可用于初始化异步I/O请求的工作项目,但应该避免向一个需要长时间才能完成的非I/O工作线程上传递一个异步I/O完成请求。
使用线程池,工作项目和所调用的函数都必须是线程池安全的。安全函数并不能保证执行它的线程是一个专门的持久的线程。一般来讲,应该避免(使用)线程本地存储(thread local storage)和把一个要求持久性的线程的异步调用进行排队,比如RegNotifyChangeKeyValue函数,但是,有一些函数可以通过传递给QueueUserWorkItem函数WT_EXECUTEINPERSISTENTTHREAD参数,把持久性的线程进行排队。
注意:线程池同单线程套间模式(STA)并不兼容。
结束
说明:
① 工作项目,可以理解为要执行的任务,一般以函数的方式给出。
相关文章推荐
- CreateFile,ReadFile等API详解(或者说MSDN的翻译)
- 完成端口在MSDN中的专题翻译
- CreateFile,ReadFile等API详解(或者说MSDN的翻译)
- 静态实现AOP(翻译自MSDN)
- MSDN中文站增加了几篇关于Smart Client的翻译文章
- 关于 Service 设计初步(MSDN节选翻译)
- MSDN中文网站关于翻译有很严重的问题
- 我翻译的一篇MSDN有关Asp.Net的文章
- 爱情保鲜——永和豆浆——MSDN翻译——1点18分
- Document Classes - MSDN6翻译交流
- CFrameWnd - MSDN6翻译交流
- wfp网络过滤框架总结(一)-主要翻译msdn ---发文于2013-11-24
- 扩展Excel Services编程框架(翻译自MSDN)
- CreateFileMapping的MSDN翻译和使用心得
- MSDN中关于完成端口相应API的翻译
- 源于网络 MSDN 翻译 VC++内联汇编
- 输入法编程指南(根据msdn翻译)
- 翻译(未完成):ADO.NET线程池概览(ADO.NET Connection Pooling at a Glance)
- CCmdUI - MSDN6翻译交流
- Direct3D11中的Device介绍(MSDN中D3D11的教程翻译)