《深入CLR(第4版 中文限量版)》針對CLR和.NET Framework 4.5(及更高版本)進行深入、全面的探討,并結(jié)合實例介紹了如何利用它們進行設計、開發(fā)和調(diào)試。全書分5部分共30章。第Ⅰ部分介紹CLR基礎(chǔ),第Ⅱ部分解釋如何設計類型,第Ⅲ部分介紹基本類型,第Ⅳ部分以核心機制為主題展開介紹,第Ⅴ部分重點介紹線程處理。
通過本書的閱讀,讀者可以掌握CLR和.NET Framework的精髓,輕松、高效地創(chuàng)建高性能應用程序。
作者Jeffrey Richter,全球知名的.NET和Windows大師,經(jīng)典暢銷書《Windows核心編程》和《CLR》系列的作者,其著作曾因其專業(yè)性和影響力榮獲中國書刊業(yè)發(fā)行協(xié)會全行業(yè)暢銷書品種稱號。
專業(yè)力作全新全面升級
名著名譯再現(xiàn)經(jīng)典魅力
基于.NET Framework 4.5和VC# 2012,適用于2022版
重點探討Framework Class Library(FCL)的核心類型
深度剖析垃圾回收、異常、泛型和線程處理等核心概念
享有全球盛譽的編程專家Jeffrey Richter,微軟.NET團隊長達十幾年的知名技術(shù)顧問,在本書中以簡潔流暢的語言將其數(shù)十年的經(jīng)驗和心得娓娓道來,獨到而深刻的見解,深思熟慮之后形成的洞見,這些都讓人醍醐灌頂,為日后構(gòu)建健壯、可靠和響應快的應用程序與組件奠定良好的基礎(chǔ)。
1999年10月,微軟的團隊首次向我展示了他們的成果:.NET Framework、公共語言運行時(Common Language Runtime,CLR)和C#編程語言?吹窖矍暗囊磺校殷@呆了,頓時覺得寫軟件的方式要發(fā)生重大變化了。他們聘請我擔任他們的顧問,我當即就同意了。剛開始,我以為.NET Framework是Win32 API和COM上的一個抽象層。但隨著我投入越來越多的時間進行研究,深刻認識到它是一個更宏大的項目。在某種程度上,它是自己的操作系統(tǒng)。它有自己的內(nèi)存管理器、自己的安全系統(tǒng)、自己的文件加載器、自己的錯誤處理機制、自己的應用程序隔離邊界(AppDomain)、自己的線程處理模型等。本書著重于解釋所有這些主題,幫助大家為這個平臺高效地設計和實現(xiàn)應用程序與組件。
我動手寫這本書是2012年10月,距離首次接觸.NET Framework和C#編程語言正好13年。13年以來, 我以微軟顧問的身份開發(fā)過各種應用程序,為.NET Framework本身也貢獻良多。我作為Wintellect(http://Wintellect.com)的合伙人,也為大量客戶提供服務,幫助他們設計、調(diào)試、優(yōu)化軟件以及解決使用.NET Framework時遇到的問題。正是因為這些資歷,我才知道如何用.NET Framework進行高效編程。貫穿全書,你會看到我數(shù)十年積累下來的經(jīng)驗。
本書面向的讀者
本書旨在解釋如何為.NET Framework開發(fā)應用程序和可重用的類。具體而言,我要解釋CLR的工作原理及其提供的功能,還要討論框架類庫(Framework Class Library,F(xiàn)CL)的各個部分。沒有一本書能完整地解釋FCL其中含有數(shù)以千計的類型,而且這個數(shù)字一直在以驚人的速度增長。所以,我準備將重點放在每個開發(fā)人員都需要注意的核心類型上。
本書圍繞Microsoft Visual Studio 2012/2013,.NET Framework 4.5.x和C# 5.0展開。由于微軟在發(fā)布這些技術(shù)的新版本時,會試圖保持很大程度的向后兼容性,所以本書描述的許多內(nèi)容也適合之前的版本。所有示例代碼都用C#編程語言寫成。但由于CLR可由許多編程語言使用,所以本書內(nèi)容也適合非C#程序員。
我和我的編輯們進行了艱苦卓絕的工作,試圖為大家提供最準確、最新、最深入、最容易閱讀和理解、沒有錯誤的信息。但是,即便有如此完美的團隊協(xié)作,疏漏和錯誤也在所難免。如果你發(fā)現(xiàn)了本書的任何錯誤或者想提出一些建設性的意見,請發(fā)送郵件給本書中文版編輯coo@netease.com。
致謝
沒有來自其他人的幫助和技術(shù)支持,我個人是不可能寫好這本書的。尤其要感謝我的家人。寫好一本書所投入的時間和精力無法衡量。我只知道,沒有我的妻子克里斯汀和兩個兒子艾登和格蘭特的支持,我根本不可能完成這本書。多少次想花些時間一家人小聚,都因為本書的寫作而放棄,F(xiàn)在,總算告一段落,我終于有時間做自己喜歡做的事情了。
本書的修訂得到了一些高人的協(xié)助。.NET Framework團隊的一些人(其中許多都是我的朋友)審閱了部分章節(jié),我和他們進行了許多發(fā)人深省的對話?死锼雇懈·納沙雷參與了我?guī)妆緯某霭,在審閱本書并確保我能以最恰當?shù)姆绞絹肀磉_的過程中,他表現(xiàn)出了非凡的才能。他對本書的品質(zhì)有至關(guān)重要的影響。和往常一樣,我和微軟出版社的團隊進行了令人愉快的合作。特別感謝本·瑞安(Ben Ryan)、德文·馬斯格羅夫(Devon Musgrave)和卡羅爾·迪林漢姆(Carol Dillingham)。另外,感謝蘇茜·卡爾(Susie Carr)和坎迪斯·辛克萊爾(Candace Sinclair)提供的編輯和制作支持。
勘誤和支持
我們一直以最大的努力保證本書的準確性。英文版勘誤或更改會添加到以下網(wǎng)頁:
http://www.oreilly.com/catalog/errata.csp?isbn=0790145353665
http://go.microsoft.com/FWLink/?Linkid=266601
如果發(fā)現(xiàn)的錯誤在此處未列出,可通過同一個網(wǎng)頁聯(lián)系我們。
如需其他支持,請發(fā)送郵件聯(lián)系我們:
mspinput@microsoft.com
注意,上述郵件地址不提供產(chǎn)品支持。
最后,本書簡體中文版的勘誤和資源下載可以訪問譯者的博客,當前中文版已綜合了英文版到(2023年)為止所有的勘誤:
https://bookzhou.com
杰弗瑞·李希特(Jeffrey Richter)
Wintellect聯(lián)合創(chuàng)始人。目前為微軟的軟件架構(gòu)師合伙人,他是公認的Windows和.NET大師,數(shù)十年來影響了數(shù)十萬優(yōu)秀的程序員,他是多部經(jīng)典著作的締造者。他崇尚大道至簡,注重效率與實用性,尤其熱愛化繁為簡,去蕪存菁。值得一提的是,他特別擅長授人以漁,能夠以通俗易懂、條理清晰的方式將普通讀者望而卻步的關(guān)鍵概念講得透徹,講得精彩。
他出版過很多本W(wǎng)indows/.NET暢銷書,擔任過MSDN的特約編輯、Win32、.NET兩個答疑專欄以及Concurrent Affairs(關(guān)于并發(fā)那些事兒)專欄的作者。他還在很多全球性商業(yè)研討會上發(fā)表演講。作為最懂Windows和.NET的人,他從1990年開始以顧問身份為微軟提供服務,他寫的代碼先后被微軟的很多產(chǎn)品采用。此外,他還為AT&T、IBM、英特爾、夢工廠、通用和惠普等提供過咨詢服務。
他愛好廣泛,擁有飛機駕照和直升機駕照,還是國際魔法師協(xié)會成員。他愛好音樂(尤其是20世紀70年代的爵士樂和前衛(wèi)搖滾樂)、擊鼓、火車模型和空手道。他還喜歡旅游和戲劇。他與家人居住在華盛頓州的柯克蘭。
周靖
微軟MVP(最有價值專家),技術(shù)型知名譯者。涉獵廣泛,具有深厚的技術(shù)功底和良好的文學素養(yǎng)。早期癡迷于硬件,曾多年擔任《微型計算機》雜志特約作者。繼而潛心鉆研程序設計并積累了豐富的編程經(jīng)驗。翻譯風格嚴謹、準確、樸實、流暢,深受讀者好評。代表譯著有《C 入門經(jīng)典》(第10版)、《Windows核心編程》(第5版中文限量版)、《深入CLR》(第4版 中文限量版)、《Visual C#從入門到精通》(第10版)、《學習Python》(第6版)以及《學習C 20》(中文版)等。
近兩年,對機器學習有濃厚的興趣,翻譯出版《機器學習與人工智能實戰(zhàn):基于業(yè)務場景的工程應用》之后,開始研究、訓練和應用大語言模型。
第I部分CLR基礎(chǔ)
第1章CLR的執(zhí)行模型
第2章生成、打包、部署和管理應用程序及類型
第3章共享程序集和強命名程序集
第Ⅱ部分設計類型
第4章類型基礎(chǔ)
第5章基元類型、引用類型和值類型
第6章類型和成員基礎(chǔ)
第7章常量和字段
第8章方法
第9章參數(shù)
第10章屬性
第11章事件
第12章泛型
第13章接口
第Ⅲ部分基本類型
第14章字符、字符串和文本處理
第15章枚舉類型和位標志
第16章數(shù)組
第17章委托
第18章定制特性
第19章可空值類型
第Ⅳ部分核心機制
第20章異常和狀態(tài)管理
第21章托管堆和垃圾回收
第22章CLR寄宿和AppDomain
第23章程序集加載和反射
第24章運行時序列化
第25章與WinRT組件互操作
第Ⅴ部分線程處理
第26章線程基礎(chǔ)
第27章計算限制的異步操作
第28章I/O限制的異步操作
第29章基元線程同步構(gòu)造
第30章混合線程同步構(gòu)造
術(shù)語表
詳細目錄
第I部分CLR基礎(chǔ)
第1章CLR的執(zhí)行模型 003
1.1將源代碼編譯成托管模塊 003
1.2將托管模塊合并成程序集 007
1.3加載公共語言運行時(CLR) 008
1.4執(zhí)行程序集的代碼 011
1.4.1IL和驗證 017
1.4.2不安全的代碼 018
1.5本機代碼生成器NGen.exe 020
1.6Framework類庫簡介 022
1.7通用類型系統(tǒng) 025
1.8公共語言規(guī)范 027
1.9與非托管代碼的互操作性 031
第2章生成、打包、部署和管理應用程序及類型 033
2.1.NET Framework部署目標 034
2.2將類型生成到模塊中 035
2.3元數(shù)據(jù)概述 038
2.4將模塊合并成程序集 045
2.4.1使用Visual Studio IDE將程序集添加到項目中 052
2.4.2使用程序集鏈接器 053
2.4.3為程序集添加資源文件 054
2.5程序集版本資源信息 055
2.6語言文化 060
2.7簡單應用程序部署(私有部署的程序集) 061
2.8簡單管理控制(配置) 063
第3章共享程序集和強命名程序集 067
3.1兩種程序集,兩種部署 068
3.2為程序集分配強名稱 069
3.3全局程序集緩存 074
3.4在生成的程序集中引用強命名程序集 076
3.5強命名程序集能防篡改 077
3.6延遲簽名 078
3.7私有部署強命名程序集 081
3.8運行時如何解析類型引用 082
3.9高級管理控制(配置) 085
第Ⅱ部分設計類型
第4章類型基礎(chǔ) 093
4.1所有類型都從System.Object派生 093
4.2類型轉(zhuǎn)換 095
4.3命名空間和程序集 100
4.4在運行時的相互關(guān)系 104
第5章基元類型、引用類型和值類型 113
5.1編程語言的基元類型 113
5.2引用類型和值類型 121
5.3值類型的裝箱和拆箱 127
5.3.1使用接口更改已裝箱值類型中的字段(以及為何不該這樣做) 139
5.3.2對象相等性和同一性 142
5.4對象哈希碼 145
5.5dynamic基元類型 147
第6章類型和成員基礎(chǔ) 155
6.1類型的各種成員 155
6.2類型的可見性 158
6.3成員的可訪問性 160
6.4靜態(tài)類 162
6.5分部類、結(jié)構(gòu)和接口 163
6.6組件、多態(tài)和版本控制 164
6.6.1CLR如何調(diào)用虛方法、屬性和事件 167
6.6.2合理使用類型的可見性和成員的可訪問性 171
6.6.3對類型進行版本控制時的虛方法的處理 173
第7章常量和字段 179
7.1常量 179
7.2字段 181
第8章方法 185
8.1實例構(gòu)造器和類(引用類型) 185
8.2實例構(gòu)造器和結(jié)構(gòu)(值類型) 189
8.3類型構(gòu)造器 192
8.4操作符重載方法 196
8.5轉(zhuǎn)換操作符方法 200
8.6擴展方法 204
8.6.1規(guī)則和指導原則 206
8.6.2用擴展方法擴展各種類型 207
8.6.3ExtensionAttribute類 209
8.7分部方法 210
第9章參數(shù) 215
9.1可選參數(shù)和命名參數(shù) 215
9.1.1規(guī)則和指導原則 217
9.1.2DefaultParameterValue特性和Optional特性 218
9.2隱式類型的局部變量 219
9.3以傳引用的方式向方法傳遞參數(shù) 221
9.4向方法傳遞可變數(shù)量的參數(shù) 227
9.5參數(shù)和返回類型的設計規(guī)范 229
9.6常量性 231
第10章屬性 233
10.1無參屬性 233
10.1.1自動實現(xiàn)的屬性 237
10.1.2合理定義屬性 238
10.1.3對象和集合初始化器 241
10.1.4匿名類型 243
10.1.5System.Tuple類型 246
10.2有參屬性 248
10.3調(diào)用屬性訪問器方法時的性能 253
10.4屬性訪問器的可訪問性 254
10.5泛型屬性訪問器方法 254
第11章事件 255
11.1設計要公開事件的類型 257
11.1.1第一步:定義類型來容納所有需要發(fā)送給事件通知接收者的附加信息 257
11.1.2第二步:定義事件成員 258
11.1.3第三步:定義負責引發(fā)事件的方法來通知事件的登記對象 259
11.1.4第四步:定義方法將輸入轉(zhuǎn)化為期望事件 262
11.2編譯器如何實現(xiàn)事件 262
11.3設計偵聽事件的類型 264
11.4顯式實現(xiàn)事件 266
第12章泛型 271
12.1FCL中的泛型 276
12.2泛型基礎(chǔ)結(jié)構(gòu) 277
12.2.1開放類型和封閉類型 278
12.2.2泛型類型和繼承 280
12.2.3泛型類型同一性 282
12.2.4代碼爆炸 283
12.3泛型接口 284
12.4泛型委托 285
12.5委托和接口的逆變和協(xié)變泛型類型實參 286
12.6泛型方法 288
12.7泛型和其他成員 291
12.8可驗證性和約束 291
12.8.1主要約束 294
12.8.2次要約束 295
12.8.3構(gòu)造器約束 296
12.8.4其他可驗證性問題 297
第13章接口 301
13.1類和接口繼承 302
13.2定義接口 302
13.3繼承接口 304
13.4關(guān)于調(diào)用接口方法的更多探討 306
13.5隱式和顯式接口方法實現(xiàn)(幕后機制) 308
13.6泛型接口 309
13.7泛型和接口約束 312
13.8實現(xiàn)多個具有相同方法名和簽名的接口 313
13.9用顯式接口方法實現(xiàn)來增強編譯時類型安全性 314
13.10謹慎使用顯式接口方法實現(xiàn) 316
13.11設計:基類還是接口 319
第Ⅲ部分基本類型
第14章字符、字符串和文本處理 323
14.1字符 323
14.2System.String類型 327
14.2.1構(gòu)造字符串 327
14.2.2字符串是不可變的 329
14.2.3比較字符串 330
14.2.4字符串留用 337
14.2.5字符串池 340
14.2.6檢查字符串中的字符和文本元素 340
14.2.7其他字符串操作 342
14.3高效率構(gòu)造字符串 343
14.3.1構(gòu)造StringBuilder對象 343
14.3.2StringBuilder的成員 344
14.4獲取對象的字符串表示:ToString 347
14.4.1指定具體的格式和語言文化 347
14.4.2將多個對象格式化成一個字符串 352
14.4.3提供定制格式化器 353
14.5解析字符串來獲取對象:Parse 356
14.6編碼:字符和字節(jié)的相互轉(zhuǎn)換 358
14.6.1字符和字節(jié)流的編碼和解碼 364
14.6.2Base-64字符串編碼和解碼 365
14.7安全字符串 366
第15章枚舉類型和位標志 371
15.1枚舉類型 371
15.2位標志 378
15.3向枚舉類型添加方法 381
第16章數(shù)組 383
16.1初始化數(shù)組元素 386
16.2數(shù)組轉(zhuǎn)型 388
16.3所有數(shù)組都隱式派生自System.Array 391
16.4所有數(shù)組都隱式實現(xiàn)IEnumerable、ICollection和IList 391
16.5數(shù)組的傳遞和返回 392
16.6創(chuàng)建下限非零的數(shù)組 393
16.7數(shù)組的內(nèi)部工作原理 395
16.8不安全的數(shù)組訪問和固定大小的數(shù)組 399
第17章委托 403
17.1初識委托 403
17.2用委托回調(diào)靜態(tài)方法 406
17.3用委托回調(diào)實例方法 408
17.4委托揭秘 408
17.5用委托回調(diào)多個方法(委托鏈) 412
17.5.1C#語言對委托鏈的支持 417
17.5.2取得對委托鏈調(diào)用的更多控制 417
17.6委托定義不要太多(泛型委托) 420
17.7C#為委托提供的簡化語法 421
17.7.1簡化語法1:不需要構(gòu)造委托對象 422
17.7.2簡化語法2:不需要定義回調(diào)方法(lambda表達式) 422
17.7.3簡化語法3:局部變量不需要手動包裝到類中即可傳給回調(diào)方法 426
17.8委托和反射 429
第18章定制特性 433
18.1使用定制特性 434
18.2定義自己的特性類 437
18.3特性構(gòu)造器和字段/屬性數(shù)據(jù)類型 441
18.4檢測定制特性 442
18.5兩個特性實例的相互匹配 447
18.6檢測定制特性時不創(chuàng)建從Attribute派生的對象 450
18.7條件特性類 453
第19章可空值類型 455
19.1C#語言對可空值類型的支持 457
19.2C#語言的空接合操作符 460
19.3CLR對可空值類型的特殊支持 461
19.3.1可空值類型的裝箱 462
19.3.2可空值類型的拆箱 462
19.3.3通過可空值類型調(diào)用GetType 463
19.3.4通過可空值類型調(diào)用接口方法 463
第Ⅳ部分核心機制
第20章異常和狀態(tài)管理 467
20.1定義異常 468
20.2異常處理機制 469
20.2.1try塊 470
20.2.2catch塊 471
20.2.3finally塊 473
20.3System.Exception類 476
20.4FCL定義的異常類 480
20.5拋出異常 484
20.6定義自己的異常類 485
20.7犧牲可靠性來換取開發(fā)效率 488
20.8設計規(guī)范和最佳實踐 497
20.8.1善用finally塊 497
20.8.2不要什么都捕捉 499
20.8.3得體地從異常中恢復 500
20.8.4發(fā)生不可恢復的異常時回滾部分完成的操作維持狀態(tài) 501
20.8.5隱藏實現(xiàn)細節(jié)來維系協(xié)定 502
20.9未處理的異常 505
20.10對異常進行調(diào)試 509
20.11異常處理的性能問題 511
20.12約束執(zhí)行區(qū)域(CER) 514
20.13代碼協(xié)定 517
第21章托管堆和垃圾回收 525
21.1托管堆基礎(chǔ) 525
21.1.1從托管堆分配資源 526
21.1.2垃圾回收算法 527
21.1.3垃圾回收和調(diào)試 530
21.2代:提升性能 533
21.2.1垃圾回收觸發(fā)條件 538
21.2.2大對象 539
21.2.3垃圾回收模式 539
21.2.4強制垃圾回收 542
21.2.5監(jiān)視應用程序的內(nèi)存使用 544
21.3使用需要特殊清理的類型 545
21.3.1使用包裝了本機資源的類型 552
21.3.2一個有趣的依賴性問題 557
21.3.3GC為本機資源提供的其他功能 558
21.3.4終結(jié)的內(nèi)部工作原理 563
21.3.5手動監(jiān)視和控制對象的生存期 565
第22章CLR寄宿和AppDomain 573
22.1CLR寄宿 574
22.2AppDomain 576
22.3卸載AppDomain 590
22.4監(jiān)視AppDomain 592
22.5AppDomain FirstChance異常通知 594
22.6宿主如何使用AppDomain 594
22.6.1可執(zhí)行應用程序 594
22.6.2Silverlight富Internet應用程序 595
22.6.3ASP.NET和XML Web服務應用程序 595
22.6.4SQL Server 596
22.6.5更多的用法只局限于想象力 596
22.7高級宿主控制 597
22.7.1使用托管代碼管理CLR 597
22.7.2寫健壯的宿主應用程序 598
22.7.3宿主如何拿回它的線程 599
第23章程序集加載和反射 603
23.1程序集加載 604
23.2使用反射構(gòu)建動態(tài)可擴展應用程序 609
23.3反射的性能 610
23.3.1發(fā)現(xiàn)程序集中定義的類型 610
23.3.2類型對象的準確含義 611
23.3.3構(gòu)建Exception派生類型的層次結(jié)構(gòu) 613
23.3.4構(gòu)造類型的實例 615
23.4設計支持加載項的應用程序 618
23.5使用反射發(fā)現(xiàn)類型的成員 620
23.5.1發(fā)現(xiàn)類型的成員 621
23.5.2調(diào)用類型的成員 625
23.5.3使用綁定句柄減少進程的內(nèi)存消耗 631
第24章運行時序列化 635
24.1序列化/反序列化快速入門 637
24.2使類型可序列化 641
24.3控制序列化和反序列化 643
24.4格式化器如何序列化類型實例 647
24.5控制序列化/反序列化的數(shù)據(jù) 648
24.6流上下文 655
24.7類型序列化為不同類型,對象反序列化為不同對象 657
24.8序列化代理 660
24.9反序列化對象時重寫程序集/類型 665
第25章與WinRT組件互操作 667
25.1CLR投射與WinRT組件類型系統(tǒng)規(guī)則 669
25.2框架投射 673
25.2.1從.NET代碼中調(diào)用異步WinRT API 674
25.2.2WinRT流和.NET流之間的互操作 678
25.2.3在CLR和WinRT之間傳輸數(shù)據(jù)塊 680
25.3用C#語言定義WinRT組件 683
第Ⅴ部分線程處理
第26章線程基礎(chǔ) 693
26.1Windows為什么要支持線程 694
26.2線程開銷 695
26.3停止瘋狂 698
26.4CPU發(fā)展趨勢 701
26.5CLR線程和Windows線程 702
26.6使用專用線程執(zhí)行異步的計算限制操作 703
26.7使用線程的理由 705
26.8線程調(diào)度和優(yōu)先級 707
26.9前臺線程和后臺線程 712
26.10深入學習 714
第27章計算限制的異步操作 715
27.1CLR線程池基礎(chǔ) 716
27.2執(zhí)行簡單的計算限制操作 717
27.3執(zhí)行上下文 718
27.4協(xié)作式取消和超時 720
27.5任務 725
27.5.1等待任務完成并獲取結(jié)果 726
27.5.2取消任務 728
27.5.3任務完成時自動啟動新任務 730
27.5.4任務可以啟動子任務 732
27.5.5任務內(nèi)部揭秘 733
27.5.6任務工廠 735
27.5.7任務調(diào)度器 737
27.6Parallel的靜態(tài)方法For、ForEach和Invoke 739
27.7并行語言集成查詢(PLINQ) 743
27.8執(zhí)行定時計算限制操作 746
27.9線程池如何管理線程 750
27.9.1設置線程池限制 750
27.9.2如何管理工作者線程 751
第28章I/O限制的異步操作 753
28.1Windows如何執(zhí)行I/O操作 754
28.2C#的異步函數(shù) 758
28.3編譯器如何將異步函數(shù)轉(zhuǎn)換成狀態(tài)機 760
28.4異步函數(shù)擴展性 764
28.5異步函數(shù)和事件處理程序 768
28.6FCL的異步函數(shù) 768
28.7異步函數(shù)和異常處理 770
28.8異步函數(shù)的其他功能 771
28.9應用程序及其線程處理模型 774
28.10以異步方式實現(xiàn)服務器 777
28.11取消I/O操作 777
28.12有的I/O操作必須同步進行 779
28.13I/O請求優(yōu)先級 780
第29章基元線程同步構(gòu)造 783
29.1類庫和線程安全 785
29.2基元用戶模式和內(nèi)核模式構(gòu)造 786
29.3用戶模式構(gòu)造 788
29.3.1易變構(gòu)造 789
29.3.2互鎖構(gòu)造 794
29.3.3實現(xiàn)簡單的自旋鎖 799
29.3.4Interlocked Anything模式 803
29.4內(nèi)核模式構(gòu)造 805
29.4.1Event構(gòu)造 809
29.4.2Semaphore構(gòu)造 811
29.4.3Mutex構(gòu)造 812
第30章混合線程同步構(gòu)造 815
30.1一個簡單的混合鎖 816
30.2自旋、線程所有權(quán)和遞歸 817
30.3FCL中的混合構(gòu)造 820
30.3.1ManualResetEventSlim類和SemaphoreSlim類 820
30.3.2Monitor類和同步塊 821
30.3.3ReaderWriterLockSlim類 826
30.3.4OneManyLock類 829
30.3.5CountdownEvent類 831
30.3.6Barrier類 831
30.3.7線程同步構(gòu)造小結(jié) 832
30.4著名的雙檢鎖技術(shù) 834
30.5條件變量模式 839
30.6異步的同步構(gòu)造 841
30.7并發(fā)集合類 846
術(shù)語表 851