《Win32多线程程序设计》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)Jim Beveridge & Robert Wiener著;侯捷译
  • 出 版 社:武汉:华中科技大学出版社
  • 出版年份:2002
  • ISBN:756092638X
  • 页数:453 页
图书介绍:《Win32多线程程序设计》全书共分三篇。第一篇包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途;第二篇介绍C runtime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行对线程等内容;第三篇谈论如何组织一个程序,使它有效支持多线程。

第一篇 上路吧,线程 3

第1章 为什么要“千头万绪” 3

一条曲折的路 4

FAQ 01:合作型(cooperative)多任务与抢先式(preemptive)多任务有何不同? 5

Frequently Asked Questions 5

常见问答集 5

FAQ 02:我可以在Win32s中使用多个线程吗? 6

函数索引(Function Index)…………………………………封面里常见问答集(Frequently Asked Questions) 7

与线程共枕 7

目录 7

为什么最终用户也需要多线程多任务 8

FAQ 03:线程和进程有何不同? 10

Win32基础 10

FAQ 04:线程在操作系统中携带多少“行李”? 11

Context Switching 14

FAQ 05:Context Switch是怎么发生的? 14

Race Conditions(竞争条件) 16

Atomic Operations(原子操作) 19

线程之间如何通讯 22

好消息与坏消息 22

第2章 线程的第一次接触 25

产生一个线程 26

使用多个线程的结果 31

核心对象(Kernel Objects) 36

FAQ 06:为什么我应该调用CloseHandle()? 38

FAQ 07:为什么可以在不结束线程的情况下关闭其handle? 40

线程结束代码(Exit Code) 40

结束一个线程 45

FAQ 08:如果线程还在运行而我的程序结束了,会怎样? 47

FAQ 09:什么是MTVERIFY? 48

错误处理 48

后台打印(Background Printing) 50

成功的秘诀 59

第3章 快跑与等待 61

看似闲暇却忙碌(Busy Waiting) 62

性能监视器(Performance Monitor) 66

等待一个线程的结束 72

叮咚:被激发的对象(Signaled Objects) 74

FAQ 10:我如何得知一个核心对象是否处于激发状态? 74

FAQ 11:什么是一个被激发的对象? 75

FAQ 12:“激发”对于不同的核心对象有什么不同的意义? 76

等待多个对象 77

FAQ 13:我如何在主线程中等待一个handle? 85

在一个GUI程序中等待 85

提要 91

第4章 同步控制(Synchronization) 93

Critical Sections(关键区域、临界区域) 95

FAQ 14:如果线程在critical sections中停很久,会怎样? 101

FAQ 15:如果线程在critical sections中结束,会怎样? 101

死锁(Deadlock) 102

FAQ 16:我如何避免死锁? 103

哲学家进餐问题(The Dining Philosophers) 103

FAQ 17:我能够等待一个以上的critical sections吗? 106

互斥器(Mutexes) 107

信号量(Semaphores) 115

FAQ 18:谁才拥有semaphore? 118

事件(Event Objects) 120

FAQ 19:Event object有什么用途? 120

FAQ 20:如果我对着一个event对象调用PulseEvent()并且没有线程正在等待,会怎样? 124

从Worker线程中显示输出 124

Interlocked Variables 125

同步机制摘要 128

第5章 不要让线程成为脱缰野马 131

干净地终止一个线程 132

线程优先权(Thread Priority) 138

初始化一个线程 144

提要 146

第6章 Overlapped I/O,在你身后变戏法 149

FAQ 21:什么是overlapped I/O? 150

FAQ 22:Overlapped I/O在Windows 95上有什么限制? 150

Win32文件操作函数 151

FAQ 23:我能够以C runtime library使用overlapped I/O吗? 152

被激发的File Handles 155

FAQ 24:Overlapped I/O总是异步地(asynchronously)执行吗? 158

FAQ 25:我应该如何为overlapped I/O产生一个event对象? 159

被激发的Event对象 159

FAQ 26:ReadFileEx()和WriteFileEx()的优点是什么? 163

FAQ 27:一个I/O completion routine何时被调用? 163

异步过程调用(Asynchronous Procedure Calls,APCs) 163

FAQ 28:我如何把一个用户自定义数据传递给I/O completion routine? 165

FAQ 29:我如何把C++成员函数当做一个I/O completion routine? 170

对文件进行Overlapped I/O的缺点 171

I/O Completion Ports 172

FAQ 30:在一个高效率服务器(server)上我应该怎么进行I/O? 172

FAQ 31:为什么一个I/O completion ports是如此特殊? 175

FAQ 32:一个I/O completion port上应该安排多少个线程等待? 179

对Sockets使用Overlapped I/O 182

FAQ 33:为什么我不应该使用select()? 183

提要 190

第7章 数据一致性(Data Consistency) 195

第二篇 多线程程序设计的工具与手法 195

认识volatile关键字 196

FAQ 34:volatile如何影响编译器的最优化操作? 198

Referential Integrity 200

The Readers/Writers Lock 205

FAQ 35:什么是Readers/Writers lock? 206

我需要锁定吗? 214

FAQ 36:一次应该锁住多少数据? 215

Lock Granularity(锁定粒度) 215

提要 216

第8章 使用C Run-time Library 219

FAQ 37:我应该使用多线程版本的C run-time library吗? 220

什么是C Runtime Library多线程版本 220

FAQ 38:我如何选择一套适当的C run-time library? 221

选择一个多线程版本的C Runtime Library 221

以C Runtime Library启动线程 224

FAQ 39:我如何使用_beginthreadex()和_endthreadex()? 224

FAQ 40:什么时候我应该使用_beginthreadex()而非CreateThread()? 227

哪一个好:CreateThread()抑或_beginthreadex()? 227

避免stdio.h 237

FAQ 41:我如何使用Console API取代stdio.h? 240

一个安全的多线程程序 240

FAQ 42:为什么我不应该使用_beginthread()? 248

结束进程(Process) 248

为什么你应该避免beginthread() 248

提要 251

第9章 使用C++ 253

处理有问题的_beginthreadex()数原型 253

以一个C++对象启动一个线程 256

FAQ 43:我如何以一个C++成员函数当做线程起始函数? 256

FAQ 44:我如何以一个成员函数当做线程起始函数? 261

建立比较安全的Critical Sections 265

建立比较安全的Locks 268

建立可互换(Interchangeable)的locks 270

异常情况(Exceptions)的处理 274

提要 274

第10章 MFC中的线程 277

在MFC中启动一个Worker线程 278

FAQ 45:我如何能够阻止一个线程杀掉它自己? 282

安全地使用AfxBeginThread()的传回值 282

在MFC中启动一个UI线程 288

FAQ 46:CWinApp和主线程之间有什么关系? 290

与MFC对象共处 293

FAQ 47:我如何设定AfxBeginThread()中的pThreadClass参数? 293

MFC的同步控制 296

MFC对于MsgWaitForMultipleObjects()的支持 300

提要 301

第11章 GDI与窗口管理 303

线程的消息队列 304

消息如何周游列国 306

GUI效率问题 311

以Worker线程完成多线程版MDI程序 311

多个上层窗口(Top Level Windows)如何是好? 313

线程之间的通讯 314

NT的影子线程(shadow thread) 316

关于“Cancel”对话框 316

锁住GDI对象 319

提要 319

第12章 调试 321

有计划地对付错误 322

使用WindowsNT 322

Bench Testing 323

FAQ 48:我如何对一个特定的线程调试? 324

线程对话框 324

运转记录(Logging) 325

内存记号(Memory Trails) 327

硬件调试寄存器(Hardware Debug Registers) 328

科学方法 330

提要 333

第13章 进程之间的通讯(Interprocess Communication) 335

以消息队列权充数据转运中心 336

使用共享内存(Shared Memory) 345

使用指针指向共享内存(Shared Memory) 354

较高层次的进程通讯(IPC) 362

提要 364

第14章 建造DLLs 367

DLL的通告消息(Notifications) 369

FAQ 49:如果一个新的线程使用了我的DLL,我如何被告知? 370

通告消息(Notifications)的问题 375

FAQ 50:为什么我在写DLL时需要小心所谓的动态链接? 376

DLL进入点的依序执行(Serialization)特性 378

FAQ 51:为什么我在DllMain中启动一个线程时必须特别小心? 379

MFC中的DLL通告消息(Notifications) 379

喂食给Worker线程 380

线程局部存储(Thread Local Storage,TLS) 384

FAQ 52:我如何在DLL中设定一个thread local storage(TLS)? 389

declspec(thread) 390

数据的一致性 392

FAQ 53:_declspec(thread)的限制是什么? 392

提要 393

第三篇 真实世界中的多线程应用程序 397

第15章 规划一个应用程序 397

多线程的理由 398

FAQ 54:我应该在什么时候使用多线程? 398

要线程还是要进程? 403

多线程程序的架构 404

FAQ 55:我能够对既有程序代码进行多线程操作吗? 406

评估既有程序代码的适用性 406

FAQ 56:我可以在我的数据库应用程序中使用多线程吗? 411

对ODBC做规划 411

第三方的函数库(Third-PartyLibraries) 413

提要 413

第16章 ISAPI 415

Web服务器及其工作原理 416

ISAPI 417

IS2ODBC范例程序 420

提要 427

第17章 OLE,ActiveX,COM 429

COM的线程模型(COM Threading Models) 431

AUTOINCR范例程序 437

提要 443

附录A MTVERIFY宏 445

附录B 更多的信息 451