目錄:
一. 多線程基礎(chǔ)
1.進程
2.線程
3.進程和線程的比較
4.線程的串行
5.多線程
6.多線程原理
7.多線程優(yōu)缺點
8.多線程的應(yīng)用
二. 多線程實現(xiàn)方案
1.pthreads
2.NSThread
3.GCD
4.NSOperation
三.三種多線程技術(shù)比較
四.多線程的鎖
1.什么是鎖
2.鎖的分類
3.性能對比
4.常見的死鎖
一. 多線程基礎(chǔ)
1.進程
進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序
每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)
2.線程
一個進程要想執(zhí)行任務(wù),必須得有線程(每1個進程至少要有1條線程,稱為主線程)
一個進程(程序)的所有任務(wù)都在線程中執(zhí)行
3.進程和線程的比較
1.線程是CPU調(diào)用(執(zhí)行任務(wù))的最小單位。
2.進程是CPU分配資源的最小單位。
3.一個進程中至少要有一個線程。
4.同一個進程內(nèi)的線程共享進程的資源。
4.線程的串行
一個線程中任務(wù)的執(zhí)行是串行的
如果要在一個線程中執(zhí)行多個任務(wù),那么只能一個一個地按順序執(zhí)行這些任務(wù)
也就是說,在同一時間內(nèi),一個線程只能執(zhí)行一個任務(wù)
5.多線程
一個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)
多線程技術(shù)可以提高程序的執(zhí)行效率
6.多線程原理
同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行),多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換),如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象。
那么如果線程非常非常多,會發(fā)生什么情況?
CPU會在N多線程之間調(diào)度,CPU會累死,消耗大量的CPU資源,同時每條線程被調(diào)度執(zhí)行的頻次也會會降低(線程的執(zhí)行效率降低)。
因此我們一般只開3-5條線程。
7.多線程優(yōu)缺點
多線程的優(yōu)點:
能適當(dāng)提高程序的執(zhí)行效率
能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)
多線程的缺點:
創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90毫秒的創(chuàng)建時間
如果開啟大量的線程,會降低程序的性能,線程越多,CPU在調(diào)度線程上的開銷就越大。
程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享等問題。
8.多線程的應(yīng)用
主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
主線程的使用注意
別將比較耗時的操作放到主線程中
耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗
將耗時操作放在子線程中執(zhí)行,提高程序的執(zhí)行效率
一些其他的概念可以閱讀文章iOS多線程詳解:概念篇,在此不再贅述。
二. 多線程實現(xiàn)方案

pthreads
pthread: 跨平臺,適用于多種操作系統(tǒng),可移植性強,是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,所以在實際開發(fā)中通常不使用。
NSThread
NSThread: 基于OC語言的API,使得其簡單易用,面向?qū)ο蟛僮?。線程的聲明周期由程序員管理,在實際開發(fā)中偶爾使用。
GCD
GCD: 基于C語言的API,充分利用設(shè)備的多核,旨在替換NSThread等線程技術(shù)。線程的生命周期由系統(tǒng)自動管理,在實際開發(fā)中經(jīng)常使用。
NSOperation
NSOperation: 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向?qū)ο蟆>€程生命周期由系統(tǒng)自動管理,在實際開發(fā)中經(jīng)常使用。
三.三種多線程技術(shù)比較
1、NSThread
優(yōu)點:NSThread 比其他兩個輕量級,使用簡單
缺點:需要自己管理線程的生命周期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷
2、GCD
GCD 是iOS 4.0以后才出現(xiàn)的并發(fā)技術(shù)
使用方式:將任務(wù)添加到隊列(串行/并行(全局)),指定執(zhí)行任務(wù)的方法,(同步(阻塞)/異步 )
拿到主隊列:dispatch_get_main_queu()
NSOperation無法做到的:1.一次性執(zhí)行,2.延遲執(zhí)行,3.調(diào)度組(op實現(xiàn)要復(fù)雜的多 )
3、NSOperation
NSOperation iOS2.0的時候就出現(xiàn)了(當(dāng)時不好用,后來蘋果對其進行改造)
使用方式:將操作(異步執(zhí)行)添加到隊列(并發(fā)/全局)
拿到主隊列:[NSOperationQueue mainQueue] 主隊列,任務(wù)添加到主隊列就會在主線程執(zhí)行
提供了GCD不好實現(xiàn)的:1.最大并發(fā)數(shù),2.暫停和繼續(xù),3.取消所有任務(wù),4.依賴關(guān)系
GCD是比較底層的封裝,我們知道較低層的代碼一般性能都是比較高的,相對于NSOperationQueue。所以追求性能,而功能夠用的話就可以考慮使用GCD。如果異步操作的過程需要更多的用戶交互和被UI顯示出來,NSOperationQueue會是一個好選擇。如果任務(wù)之間沒有什么依賴關(guān)系,而是需要更高的并發(fā)能力,GCD則更有優(yōu)勢。
四.多線程的鎖
參考文章
iOS多線程詳解:概念篇
https://bujige.net/blog/iOS-Complete-learning-GCD.html
https://juejin.im/post/5ab4a4466fb9a028d14107ff#heading-31
https://juejin.im/post/5a9e57af6fb9a028df222555
https://juejin.im/post/5a0a92996fb9a0451f307479