目錄:
一. 多線程基礎(chǔ)
1.進(jìn)程
2.線程
3.進(jìn)程和線程的比較
4.線程的串行
5.多線程
6.多線程原理
7.多線程優(yōu)缺點(diǎn)
8.多線程的應(yīng)用
二. 多線程實(shí)現(xiàn)方案
1.pthreads
2.NSThread
3.GCD
4.NSOperation
三.三種多線程技術(shù)比較
四.多線程的鎖
1.什么是鎖
2.鎖的分類
3.性能對(duì)比
4.常見的死鎖
一. 多線程基礎(chǔ)
1.進(jìn)程
進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序
每個(gè)進(jìn)程之間是獨(dú)立的仲墨,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)
2.線程
一個(gè)進(jìn)程要想執(zhí)行任務(wù)澡绩,必須得有線程(每1個(gè)進(jìn)程至少要有1條線程度宦,稱為主線程)
一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行
3.進(jìn)程和線程的比較
1.線程是CPU調(diào)用(執(zhí)行任務(wù))的最小單位脚作。
2.進(jìn)程是CPU分配資源的最小單位政基。
3.一個(gè)進(jìn)程中至少要有一個(gè)線程嵌削。
4.同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程的資源疆液。
4.線程的串行
一個(gè)線程中任務(wù)的執(zhí)行是串行的
如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù)孽水,那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù)
也就是說,在同一時(shí)間內(nèi)匣屡,一個(gè)線程只能執(zhí)行一個(gè)任務(wù)
5.多線程
一個(gè)進(jìn)程中可以開啟多條線程封救,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)
多線程技術(shù)可以提高程序的執(zhí)行效率
6.多線程原理
同一時(shí)間,CPU只能處理1條線程捣作,只有1條線程在工作(執(zhí)行)誉结,多線程并發(fā)(同時(shí))執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換)券躁,如果CPU調(diào)度線程的時(shí)間足夠快惩坑,就造成了多線程并發(fā)執(zhí)行的假象。
那么如果線程非常非常多也拜,會(huì)發(fā)生什么情況以舒?
CPU會(huì)在N多線程之間調(diào)度,CPU會(huì)累死慢哈,消耗大量的CPU資源蔓钟,同時(shí)每條線程被調(diào)度執(zhí)行的頻次也會(huì)會(huì)降低(線程的執(zhí)行效率降低)。
因此我們一般只開3-5條線程卵贱。
7.多線程優(yōu)缺點(diǎn)
多線程的優(yōu)點(diǎn):
能適當(dāng)提高程序的執(zhí)行效率
能適當(dāng)提高資源利用率(CPU滥沫、內(nèi)存利用率)
多線程的缺點(diǎn):
創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)艰赞、椨缎常空間(子線程512KB、主線程1MB方妖,也可以使用-setStackSize:設(shè)置狭魂,但必須是4K的倍數(shù),而且最小是16K)党觅,創(chuàng)建線程大約需要90毫秒的創(chuàng)建時(shí)間
如果開啟大量的線程雌澄,會(huì)降低程序的性能,線程越多杯瞻,CPU在調(diào)度線程上的開銷就越大镐牺。
程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享等問題魁莉。
8.多線程的應(yīng)用
主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點(diǎn)擊事件睬涧、滾動(dòng)事件募胃、拖拽事件等)
主線程的使用注意
別將比較耗時(shí)的操作放到主線程中
耗時(shí)操作會(huì)卡住主線程,嚴(yán)重影響UI的流暢度畦浓,給用戶一種“卡”的壞體驗(yàn)
將耗時(shí)操作放在子線程中執(zhí)行痹束,提高程序的執(zhí)行效率
一些其他的概念可以閱讀文章iOS多線程詳解:概念篇,在此不再贅述讶请。
二. 多線程實(shí)現(xiàn)方案
pthreads
pthread: 跨平臺(tái)祷嘶,適用于多種操作系統(tǒng),可移植性強(qiáng)夺溢,是一套純C語言的通用API论巍,且線程的生命周期需要程序員自己管理,使用難度較大风响,所以在實(shí)際開發(fā)中通常不使用嘉汰。
NSThread
NSThread: 基于OC語言的API,使得其簡單易用钞诡,面向?qū)ο蟛僮髦O帧>€程的聲明周期由程序員管理,在實(shí)際開發(fā)中偶爾使用荧降。
GCD
GCD: 基于C語言的API,充分利用設(shè)備的多核攒读,旨在替換NSThread等線程技術(shù)朵诫。線程的生命周期由系統(tǒng)自動(dòng)管理,在實(shí)際開發(fā)中經(jīng)常使用薄扁。
NSOperation
NSOperation: 基于OC語言API剪返,底層是GCD,增加了一些更加簡單易用的功能邓梅,使用更加面向?qū)ο笸衙ぁ>€程生命周期由系統(tǒng)自動(dòng)管理,在實(shí)際開發(fā)中經(jīng)常使用日缨。
三.三種多線程技術(shù)比較
1钱反、NSThread
優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí),使用簡單
缺點(diǎn):需要自己管理線程的生命周期匣距、線程同步面哥、加鎖、睡眠以及喚醒等毅待。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷
2尚卫、GCD
GCD 是iOS 4.0以后才出現(xiàn)的并發(fā)技術(shù)
使用方式:將任務(wù)添加到隊(duì)列(串行/并行(全局)),指定執(zhí)行任務(wù)的方法尸红,(同步(阻塞)/異步 )
拿到主隊(duì)列:dispatch_get_main_queu()
NSOperation無法做到的:1.一次性執(zhí)行吱涉,2.延遲執(zhí)行刹泄,3.調(diào)度組(op實(shí)現(xiàn)要復(fù)雜的多 )
3、NSOperation
NSOperation iOS2.0的時(shí)候就出現(xiàn)了(當(dāng)時(shí)不好用怎爵,后來蘋果對(duì)其進(jìn)行改造)
使用方式:將操作(異步執(zhí)行)添加到隊(duì)列(并發(fā)/全局)
拿到主隊(duì)列:[NSOperationQueue mainQueue] 主隊(duì)列循签,任務(wù)添加到主隊(duì)列就會(huì)在主線程執(zhí)行
提供了GCD不好實(shí)現(xiàn)的:1.最大并發(fā)數(shù),2.暫停和繼續(xù)疙咸,3.取消所有任務(wù)县匠,4.依賴關(guān)系
GCD是比較底層的封裝,我們知道較低層的代碼一般性能都是比較高的撒轮,相對(duì)于NSOperationQueue乞旦。所以追求性能,而功能夠用的話就可以考慮使用GCD题山。如果異步操作的過程需要更多的用戶交互和被UI顯示出來兰粉,NSOperationQueue會(huì)是一個(gè)好選擇。如果任務(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