多線程

并發(fā) && 并行

多線程的同時執(zhí)行并非"并行", 而是"并發(fā)", "并發(fā)"無論從宏觀還是微觀上都是同時執(zhí)行的, 而"并行"宏觀上是同時執(zhí)行, 微觀上仍然是一個cpu的在多條線程上的來回切換.

多線程解決了什么問題?

從第一個問題可以看出, cpu(單核)在多條線程之間輪詢執(zhí)行的效率必然要低于單線程執(zhí)行. 在單核cpu的機器上單線程的效率是最高的. 所以多線程的出現(xiàn)并非是為了解決cpu的效率問題 (注意: 并非說多線程不能提高cpu的效率),而是為了解決"阻塞"問題, 如: task1 在 thread1 執(zhí)行需要10秒, task2 在 thread2 需要1秒, 人們不愿意等到 task1 執(zhí)行完成之后才能看到 task2 的執(zhí)行結(jié)果, 也就是不愿意 task1 阻塞 task2 的執(zhí)行. 可以說多線程是為了解決"阻塞"問題而生的.(多核cpu的問題涉及到硬件, 還不是很清楚, 不誤導大家了)

線程的串行

線程是進程的執(zhí)行單元/路徑
一個線程中執(zhí)行多個任務, 是按順序一個個執(zhí)行的

多線程的原理

CPU在各個線程中快速切換, 其調(diào)度線程的時間夠快, 就產(chǎn)生了多線程的"并發(fā)"執(zhí)行的假象

多線程優(yōu)缺點

優(yōu)點:

  1. 可以使任何需要及時響應的任務及時響應, 如用戶UI可以在進行其它工作的同時一直處于活動狀態(tài).
  2. 可以設置線程優(yōu)先級.
  3. 可以適當提高資源利用率, 如: 下載速度最大總共1m/s的網(wǎng)絡環(huán)境下, 單線程下載 task1 && task2, 如果因為某些原因?qū)е孪螺dtask1的速度只有100k/s, 那么下載完這2個任務的時間必然很長; 如果開啟2條線程下載, 下載速度就可能達到1m/s, 如此大大提高了帶寬的利用率.

缺點:

  1. 如果線程多每條線程被調(diào)度執(zhí)行的頻次會降低(線程的執(zhí)行效率低).
  2. 線程占用內(nèi)存, 主線程默認占1M, 子線程占用512k.
  3. 線程間通信和線程間數(shù)據(jù)共享, 資源搶奪造成程序的復雜性.

線程的狀態(tài)

  1. 可調(diào)度線程池概念
    系統(tǒng)底層用于管理線程的一個"池子", 裝著所有可供系統(tǒng)調(diào)度的線程.
  2. 線程的狀態(tài)
    1. new
      為線程分配內(nèi)存空間
    2. runnable
      線程進入可調(diào)度線程池
    3. running
      線程有任務正在執(zhí)行
    4. blocked
      線程阻塞, 被移除可調(diào)度線程池
    5. dead
      線程死亡, 系統(tǒng)回收內(nèi)存

線程安全問題

  1. 資源搶占
    舉例: 如果一份文件需要張三和李四簽字, 可認為2人對應兩條線程, 若二人同時執(zhí)行簽字, 可能最后簽字結(jié)果是:張四李三, 李張三四等.
    若要解決此問題, 必須保證文件在同一段時間被一個人占用, 另一個人要么先"睡會", 要么"干點別的", "睡會"和"干點別的"對應兩種線程鎖.

    1. 同步鎖: @synchronized
      用上面的例子, 張三在簽字的過程中, 把文件''鎖住'', 李四準備來簽, 看到文件被鎖, 會"睡等"
    2. 自旋鎖 OSSpinLock
      用上面的例子, 張三在簽字的過程中, 把文件''鎖住'', 李四準備來簽, 看到文件被鎖, 會"轉(zhuǎn)圈等".

兩種鎖的效率:
?對于同步鎖,如果資源已經(jīng)被占用,下一個調(diào)用者只能先進入睡眠狀態(tài)等待轧粟。但是自旋鎖不會引起調(diào)用者睡眠,如果自旋鎖已經(jīng)被別的執(zhí)行單元保持瘸爽,下一個調(diào)用者就一直循環(huán)在那里看是否該自旋鎖的保持者已經(jīng)釋放了鎖掖棉,"自旋"一詞就是因此而得名.
看上去 "自旋"會消耗大量資源, 效率更低. 實際情況是"睡"需要改變線程的狀態(tài), 會把線程從可調(diào)度線程池中取出, 從 runnable 狀態(tài)到blocked 狀態(tài). 而"自旋"在做一個空循環(huán), 不分配任何內(nèi)存空間, 相比與改變線程的狀態(tài)系統(tǒng)消耗的資源會少一些.

  1. 原子屬性
    atomic :消耗較多資源, 相對線程安全
    nonatomic:非線程安全

線程間通信

在一個進程中, 線程往往不是孤立存在的, 多線程經(jīng)常需要相互通信:

  1. 一個線程傳遞數(shù)據(jù)給另一個線程
  2. 在一個線程中執(zhí)行完特定的任務后, 轉(zhuǎn)到另一個線程繼續(xù)執(zhí)行

iOS中多線程的實現(xiàn)方案

技術(shù) 簡介 語言 生命周期
pthread 跨平臺Unix Linux Windows C 需要管理
NSThread 面向?qū)ο?可直接操作線程對象 OC 需要管理
GCD 中樞調(diào)度系統(tǒng)(在隊列中調(diào)度任務到相應線程) C 系統(tǒng)管理
NSOperation 對GCD的封裝, 面向?qū)ο?/td> OC 系統(tǒng)管理
  1. pthread
    基本過時, 很少能看見iOS項目中有使用
  • NSThread
    iOS中 NSThread 多用于的判斷線程編號, 是否處于主線程等

  • GCD

    1. 自動管理線程的生命周期 (創(chuàng)建線程, 調(diào)度任務), C,JAVA中需要關(guān)注
    2. 核心: 任務添加隊列, 任務的取出遵循隊列FIFO原則
      在 GCD 中,一個同步函數(shù)只在完成了它預定的任務后才返回赫粥。
      一個異步函數(shù)龟劲,剛好相反胃夏,會立即返回,預定的任務會完成但不會等它完成.因此昌跌,一個異步函數(shù) . 不會阻塞當前線程去執(zhí)行下一個函數(shù).
  • NSOperation

    1. 對GCD的封裝, 是GCD的進一步抽象, NSOperation封裝了需要執(zhí)行的操作和執(zhí)行操作所需的數(shù)據(jù),讓程序員面向?qū)ο箝_發(fā).
    2. NSOperation本身是個抽象類,必須用其子類(系統(tǒng)提供子類, 也可以自定義子類)
    3. NSOperation 封裝了一些方法, 方便設置依賴, 方便取消操作, 方便判斷當前操作的狀態(tài)等.
    4. 建議較為底層的, 公用的多線程模塊使用NSOperation, 其效率雖比GCD略低, 不過其面向?qū)ο笠约澳軐崿F(xiàn)繼承的優(yōu)點就足以讓程序員們?nèi)ナ褂?

iOS中多線程講義
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仰禀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚕愤,更是在濱河造成了極大的恐慌答恶,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍诱,死亡現(xiàn)場離奇詭異悬嗓,居然都是意外死亡,警方通過查閱死者的電腦和手機裕坊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門包竹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事周瞎∶缢酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵声诸,是天一觀的道長酱讶。 經(jīng)常有香客問我,道長彼乌,這世上最難降的妖魔是什么泻肯? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮慰照,結(jié)果婚禮上软免,老公的妹妹穿的比我還像新娘。我一直安慰自己焚挠,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布漓骚。 她就那樣靜靜地躺著蝌衔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝌蹂。 梳的紋絲不亂的頭發(fā)上噩斟,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音孤个,去河邊找鬼剃允。 笑死,一個胖子當著我的面吹牛齐鲤,可吹牛的內(nèi)容都是我干的斥废。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼给郊,長吁一口氣:“原來是場噩夢啊……” “哼牡肉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆九,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤统锤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炭庙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饲窿,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年焕蹄,在試婚紗的時候發(fā)現(xiàn)自己被綠了逾雄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘲驾,靈堂內(nèi)的尸體忽然破棺而出淌哟,到底是詐尸還是另有隱情,我是刑警寧澤辽故,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布徒仓,位于F島的核電站,受9級特大地震影響誊垢,放射性物質(zhì)發(fā)生泄漏掉弛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一喂走、第九天 我趴在偏房一處隱蔽的房頂上張望殃饿。 院中可真熱鬧,春花似錦芋肠、人聲如沸乎芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奈惑。三九已至,卻和暖如春睡汹,著一層夾襖步出監(jiān)牢的瞬間肴甸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工囚巴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留原在,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓彤叉,卻偏偏與公主長得像庶柿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秽浇,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容