内容简介
第一篇 上路吧,线程
第1章 为什么要“千头万绪”
一条曲折的路
FAQ 01:合作型(cooperative)多任务与抢先式(preemptive)多任务有何不同?
Frequently Asked Questions
常见问答集
FAQ 02:我可以在Win32s中使用多个线程吗?
函数索引(Function Index)…………………………………封面里常见问答集(Frequently Asked Questions)
与线程共枕
目录
为什么最终用户也需要多线程多任务
FAQ 03:线程和进程有何不同?
Win32基础
FAQ 04:线程在操作系统中携带多少“行李”?
Context Switching
FAQ 05:Context Switch是怎么发生的?
Race Conditions(竞争条件)
Atomic Operations(原子操作)
线程之间如何通讯
好消息与坏消息
第2章 线程的第一次接触
产生一个线程
使用多个线程的结果
核心对象(Kernel Objects)
FAQ 06:为什么我应该调用CloseHandle()?
FAQ 07:为什么可以在不结束线程的情况下关闭其handle?
线程结束代码(Exit Code)
结束一个线程
FAQ 08:如果线程还在运行而我的程序结束了,会怎样?
FAQ 09:什么是MTVERIFY?
错误处理
后台打印(Background Printing)
成功的秘诀
第3章 快跑与等待
看似闲暇却忙碌(Busy Waiting)
性能监视器(Performance Monitor)
等待一个线程的结束
叮咚:被激发的对象(Signaled Objects)
FAQ 10:我如何得知一个核心对象是否处于激发状态?
FAQ 11:什么是一个被激发的对象?
FAQ 12:“激发”对于不同的核心对象有什么不同的意义?
等待多个对象
FAQ 13:我如何在主线程中等待一个handle?
在一个GUI程序中等待
提要
第4章 同步控制(Synchronization)
Critical Sections(关键区域、临界区域)
FAQ 14:如果线程在critical sections中停很久,会怎样?
FAQ 15:如果线程在critical sections中结束,会怎样?
死锁(Deadlock)
FAQ 16:我如何避免死锁?
哲学家进餐问题(The Dining Philosophers)
FAQ 17:我能够等待一个以上的critical sections吗?
互斥器(Mutexes)
信号量(Semaphores)
FAQ 18:谁才拥有semaphore?
事件(Event Objects)
FAQ 19:Event object有什么用途?
FAQ 20:如果我对着一个event对象调用PulseEvent()并且没有线程正在等待,会怎样?
从Worker线程中显示输出
Interlocked Variables
同步机制摘要
第5章 不要让线程成为脱缰野马
干净地终止一个线程
线程优先权(Thread Priority)
初始化一个线程
提要
第6章 Overlapped I/O,在你身后变戏法
FAQ 21:什么是overlapped I/O?
FAQ 22:Overlapped I/O在Windows 95上有什么限制?
Win32文件操作函数
FAQ 23:我能够以C runtime library使用overlapped I/O吗?
被激发的File Handles
FAQ 24:Overlapped I/O总是异步地(asynchronously)执行吗?
FAQ 25:我应该如何为overlapped I/O产生一个event对象?
被激发的Event对象
FAQ 26:ReadFileEx()和WriteFileEx()的优点是什么?
FAQ 27:一个I/O completion routine何时被调用?
异步过程调用(Asynchronous Procedure Calls,APCs)
FAQ 28:我如何把一个用户自定义数据传递给I/O completion routine?
FAQ 29:我如何把C++成员函数当做一个I/O completion routine?
对文件进行Overlapped I/O的缺点
I/O Completion Ports
FAQ 30:在一个高效率服务器(server)上我应该怎么进行I/O?
FAQ 31:为什么一个I/O completion ports是如此特殊?
FAQ 32:一个I/O completion port上应该安排多少个线程等待?
对Sockets使用Overlapped I/O
FAQ 33:为什么我不应该使用select()?
提要
第7章 数据一致性(Data Consistency)
第二篇 多线程程序设计的工具与手法
认识volatile关键字
FAQ 34:volatile如何影响编译器的最优化操作?
Referential Integrity
The Readers/Writers Lock
FAQ 35:什么是Readers/Writers lock?
我需要锁定吗?
FAQ 36:一次应该锁住多少数据?
Lock Granularity(锁定粒度)
提要
第8章 使用C Run-time Library
FAQ 37:我应该使用多线程版本的C run-time library吗?
什么是C Runtime Library多线程版本
FAQ 38:我如何选择一套适当的C run-time library?
选择一个多线程版本的C Runtime Library
以C Runtime Library启动线程
FAQ 39:我如何使用_beginthreadex()和_endthreadex()?
FAQ 40:什么时候我应该使用_beginthreadex()而非CreateThread()?
哪一个好:CreateThread()抑或_beginthreadex()?
避免stdio.h
FAQ 41:我如何使用Console API取代stdio.h?
一个安全的多线程程序
FAQ 42:为什么我不应该使用_beginthread()?
结束进程(Process)
为什么你应该避免beginthread()
提要
第9章 使用C++
处理有问题的_beginthreadex()数原型
以一个C++对象启动一个线程
FAQ 43:我如何以一个C++成员函数当做线程起始函数?
FAQ 44:我如何以一个成员函数当做线程起始函数?
建立比较安全的Critical Sections
建立比较安全的Locks
建立可互换(Interchangeable)的locks
异常情况(Exceptions)的处理
提要
第10章 MFC中的线程
在MFC中启动一个Worker线程
FAQ 45:我如何能够阻止一个线程杀掉它自己?
安全地使用AfxBeginThread()的传回值
在MFC中启动一个UI线程
FAQ 46:CWinApp和主线程之间有什么关系?
与MFC对象共处
FAQ 47:我如何设定AfxBeginThread()中的pThreadClass参数?
MFC的同步控制
MFC对于MsgWaitForMultipleObjects()的支持
提要
第11章 GDI与窗口管理
线程的消息队列
消息如何周游列国
GUI效率问题
以Worker线程完成多线程版MDI程序
多个上层窗口(Top Level Windows)如何是好?
线程之间的通讯
NT的影子线程(shadow thread)
关于“Cancel”对话框
锁住GDI对象
提要
第12章 调试
有计划地对付错误
使用WindowsNT
Bench Testing
FAQ 48:我如何对一个特定的线程调试?
线程对话框
运转记录(Logging)
内存记号(Memory Trails)
硬件调试寄存器(Hardware Debug Registers)
科学方法
提要
第13章 进程之间的通讯(Interprocess Communication)
以消息队列权充数据转运中心
使用共享内存(Shared Memory)
使用指针指向共享内存(Shared Memory)
较高层次的进程通讯(IPC)
提要
第14章 建造DLLs
DLL的通告消息(Notifications)
FAQ 49:如果一个新的线程使用了我的DLL,我如何被告知?
通告消息(Notifications)的问题
FAQ 50:为什么我在写DLL时需要小心所谓的动态链接?
DLL进入点的依序执行(Serialization)特性
FAQ 51:为什么我在DllMain中启动一个线程时必须特别小心?
MFC中的DLL通告消息(Notifications)
喂食给Worker线程
线程局部存储(Thread Local Storage,TLS)
FAQ 52:我如何在DLL中设定一个thread local storage(TLS)?
declspec(thread)
数据的一致性
FAQ 53:_declspec(thread)的限制是什么?
提要
第三篇 真实世界中的多线程应用程序
第15章 规划一个应用程序
多线程的理由
FAQ 54:我应该在什么时候使用多线程?
要线程还是要进程?
多线程程序的架构
FAQ 55:我能够对既有程序代码进行多线程操作吗?
评估既有程序代码的适用性
FAQ 56:我可以在我的数据库应用程序中使用多线程吗?
对ODBC做规划
第三方的函数库(Third-PartyLibraries)
提要
第16章 ISAPI
Web服务器及其工作原理
ISAPI
IS2ODBC范例程序
提要
第17章 OLE,ActiveX,COM
COM的线程模型(COM Threading Models)
AUTOINCR范例程序
提要
附录A MTVERIFY宏
附录B 更多的信息