函數索引(Function Index) 封面里
常見問答集(Frequently Asked Questions) vii
第一篇 上路吧, 線程
第1章 為什么要"千頭萬緒" 3
一條曲折的路 4
與線程共枕 7
為什么最終用戶也需要多線程多任務 8
Win32基礎 10
Context Switching 14
Race Conditions(競爭條件) 16
Atomic Operations(原子操作) 19
線程之間如何通訊 22
好消息與壞消息 22
第2章 線程的第一次接觸 25
產生一個線程 26
使用多個線程的結果 31
核心對象(Kernel Objects) 36
線程結束代碼(Exit Code) 40
結束一個線程 45
錯誤處理 48
后臺打?。˙ackground Printing) 50
成功的秘訣 59
第3章 快跑與等待 61
看似閑暇卻忙碌(Busy Waiting) 62
性能監(jiān)視器(Performance Monitor) 66
等待一個線程的結束 72
叮咚:被激發(fā)的對象(Signaled Objects) 74
等待多個對象 77
在一個GUI程序中等待 85
提要 91
第4章 同步控制(Synchronization) 93
Critical Sections(關鍵區(qū)域. 臨界區(qū)域) 95
死鎖(Deadlock) 102
哲學家進餐問題(The Dining Philosophers) 103
互斥器(Mutexes) 107
信號量(Semaphores) 115
事件(Event Objects) 120
從Worker線程中顯示輸出 124
Interlocked Variables 125
同步機制摘要 128
第5章 不要讓線程成為脫韁野馬 131
干凈地終止一個線程 132
線程優(yōu)先權(Thread Priority) 138
初始化一個線程 144
提要 146
第6章 Overlapped I/O, 在你身后變戲法 149
Win32文件操作函數 151
被激發(fā)的File Handles 155
被激發(fā)的Event對象 159
異步過程調用(Asynchronous Procedure Calls, APCs) 163
對文件進行Overlapped I/O的缺點 171
I/O Completion Ports 172
對Sockets使用Overlapped I/O 182
提要 190
第二篇 多線程程序設計的工具與手法
第7章 數據一致性(Data Consistency) 195
認識volatile關鍵字 196
Referential Integrity 200
The Readers/Writers Lock 205
我需要鎖定嗎? 214
Lock Granularity(鎖定粒度) 215
提要 216
第8章 使用C Run-time Library 219
什么是C Runtime Library多線程版本 220
選擇一個多線程版本的C Runtime Library 221
以C Runtime Library啟動線程 224
哪一個好:CreateThread()抑或 _beginthreadex()? 227
避免stdio.h 237
一個安全的多線程程序 240
結束進程(Process) 248
為什么你應該避免 _beginthread() 248
提要 251
第9章 使用C++ 253
處理有問題的 _beginthreadex()函數原型 253
以一個C++ 對象啟動一個線程 256
建立比較安全的Critical Sections 265
建立比較安全的Locks 268
建立可互換(Interchangeable)的locks 270
異常情況(Exceptions)的處理 274
提要 274
第10章 MFC中的線程 277
在MFC中啟動一個Worker線程 278
安全地使用AfxBeginThread()的傳回值 282
在MFC中啟動一個UI線程 288
與MFC對象共處 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
使用Windows NT 322
有計劃地對付錯誤 322
Bench Testing 323
線程對話框 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
通告消息(Notifications)的問題 375
DLL進入點的依序執(zhí)行(Serialization)特性 378
MFC中的DLL通告消息(Notifications) 379
喂食給Worker線程 380
線程局部存儲(Thread Local Storage, TLS) 384
_declspec(thread) 390
數據的一致性 392
提要 393
第三篇 真實世界中的多線程應用程序
第15章 規(guī)劃一個應用程序 397
多線程的理由 398
要線程還是要進程? 403
多線程程序的架構 404
評估既有程序代碼的適用性 406
對ODBC做規(guī)劃 411
第三方的函數庫(Third-Party Libraries) 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