多線程在iOS中的地位至關(guān)重要后雷,不論是找工作面試,還是日常的工作開發(fā)過程中都會(huì)經(jīng)常涉及咬最。因此翎嫡,學(xué)好多線程就顯得尤其重要了,想要學(xué)好多線程需要對(duì)它的基礎(chǔ)知識(shí)有所了解永乌,本篇文章旨在簡(jiǎn)單介紹基礎(chǔ)惑申,如有不當(dāng),歡迎指正翅雏。
進(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)
線程
- 基本概念
a. 1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每1個(gè)進(jìn)程至少要有1條線程)
b. 線程是進(jìn)程的基本執(zhí)行單元望几,一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行
- 線程的串行
a. 1個(gè)線程中任務(wù)的執(zhí)行是串行的
b. 如果要在1個(gè)線程中執(zhí)行多個(gè)任務(wù)绩脆,那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù)
c. 也就是說,在同一時(shí)間內(nèi)橄抹,1個(gè)線程只能執(zhí)行1個(gè)任務(wù)
多線程
-
基本概念
即1個(gè)進(jìn)程中可以開啟多條線程靴迫,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)
-
線程的并行
并行即同時(shí)執(zhí)行。比如同時(shí)開啟3條線程分別下載3個(gè)文件(分別是文件A楼誓、文件B玉锌、文件C)
多線程并發(fā)執(zhí)行的原理
a. 在同一時(shí)間里,CPU只能處理 1 條線程疟羹,只有 1 條線程在工作(執(zhí)行)
b. 多線程并發(fā)(同時(shí))執(zhí)行芬沉,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換),如果CPU調(diào)度線程的時(shí)間足夠快阁猜,就造成了多線程并發(fā)執(zhí)行的假象-
多線程優(yōu)缺點(diǎn)
4.1 優(yōu)點(diǎn)
a. 能適當(dāng)提高程序的執(zhí)行效率
b. 能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)
4.2 缺點(diǎn)
a. 開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下蹋艺,主線程占用1M剃袍,子線程占用512KB),如果開啟大量的線程捎谨,會(huì)占用大量的內(nèi)存空間民效,降低程序的性能
b. 線程越多,CPU在調(diào)度線程上的開銷就越大
c. 程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信涛救、多線程的數(shù)據(jù)共享
多線程在iOS開發(fā)中的應(yīng)用
- 主線程
a. 一個(gè)iOS程序運(yùn)行后畏邢,默認(rèn)會(huì)開啟 1 條線程,稱為“主線程”或“UI 線程”
b. 作用:刷新顯示 UI检吆,處理 UI 事件 - 子線程
a. 除了主線程之外的所有線程舒萎,也叫做后臺(tái)線程
b. 子線程不能用來刷新 UI - 使用注意
a. 不要將耗時(shí)操作放到主線程中去處理,因?yàn)闀?huì)卡住線程
b. 和UI相關(guān)的刷新操作必須放到主線程中進(jìn)行處理
iOS中多線程的實(shí)現(xiàn)方案
- pthread
a. 特點(diǎn):
(1)一套通用的多線程API
(2)適用于 Unix\Linux\Windows 等系統(tǒng)
(3)跨平臺(tái)\可移植
(4)使用難度大
b. 使用語言:C語言
c. 使用頻率:幾乎不用
d. 線程生命周期:由程序員進(jìn)行管理 - NSThread
a. 特點(diǎn):
(1)使用更加面向?qū)ο?br> (2)簡(jiǎn)單易用蹭沛,可直接操作線程對(duì)象
b. 使用語言:OC語言
c. 使用頻率:偶爾使用
d. 線程生命周期:由程序員進(jìn)行管理 - GCD
a. 特點(diǎn):
(1)旨在替代 NSThread 等線程技術(shù)
(2)充分利用設(shè)備的多核(自動(dòng))
b. 使用語言:C語言
c. 使用頻率:經(jīng)常使用
d. 線程生命周期:自動(dòng)管理 - NSOperation
a. 特點(diǎn):
(1)基于GCD(底層是GCD)
(2)比GCD多了一些更簡(jiǎn)單實(shí)用的功能
(3)使用更加面向?qū)ο?br> b. 使用語言:OC語言
c. 使用頻率:經(jīng)常使用
d. 線程生命周期:自動(dòng)管理
線程的狀態(tài)與安全
- 線程的狀態(tài)
-
新建臂寝、就緒章鲤、運(yùn)行、阻塞咆贬、死亡
- 注意 :線程死亡之后不能重新開啟
-
- 線程安全問題
-
安全隱患
-
當(dāng)多個(gè)線程訪問同一塊資源時(shí)败徊,很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題,比如多個(gè)線程訪問同一個(gè)對(duì)象掏缎、同一個(gè)變量皱蹦、同一個(gè)文件
- 如上圖所示,當(dāng)線程 A 進(jìn)行計(jì)算的同時(shí)眷蜈,線程 B 也進(jìn)行計(jì)算沪哺,最終的結(jié)果就會(huì)產(chǎn)生偏差
-
-
解決方案
-
添加互斥鎖
- 添加互斥鎖之后,一次只能有一個(gè)線程進(jìn)行訪問資源端蛆,只有線程 A 訪問完畢釋放資源凤粗,線程 B 才能進(jìn)行訪問
- 互斥鎖的使用格式
@synchronized(鎖對(duì)象) { // 鎖對(duì)象一般使用 self // 需要鎖定的代碼 }
- 注意: 互斥鎖能有效防止多線程搶奪資源造成的數(shù)據(jù)安全問題,但是會(huì)消耗大量資源今豆,在實(shí)際開發(fā)中不要亂加互斥鎖嫌拣。
-
-