iOS線程懂诗、隊列與死鎖

iOS中關(guān)于線程和隊列蜂嗽,有一些概念:隊列串行隊列响禽、并發(fā)隊列徒爹、主線程荚醒、主隊列芋类、任務(wù)隆嗅、同步異步侯繁。這些概念的意義和聯(lián)系又是什么呢胖喳?

本質(zhì)上

  • 隊列:隊列就是一個裝任務(wù)的容器,存儲著需要執(zhí)行的各個任務(wù)贮竟。FIFO(先進(jìn)先出原則)
  • 線程:線程就是具體的執(zhí)行任務(wù)的人丽焊,是干活的。隊列中的任務(wù)的執(zhí)行要在線程中執(zhí)行咕别。一直在跑代碼流技健。
  • 串行隊列:執(zhí)行里面的B任務(wù)需要等待他前面的A任務(wù)執(zhí)行完畢才能執(zhí)行。存放任務(wù)符合隊列的本質(zhì):FIFO(先進(jìn)先出)惰拱。
  • 并發(fā)隊列:執(zhí)行隊列里面的B任務(wù)雌贱,不需要等待他前面的A任務(wù)執(zhí)行完畢才能執(zhí)行。存放任務(wù)符合隊列的本質(zhì):FIFO偿短。
  • 主隊列:系統(tǒng)自動生成的欣孤,用于存放任務(wù)的隊列,只有唯一的一個昔逗,他是串行隊列降传。任務(wù)默認(rèn)都存放在主隊列。
  • 主線程:與主隊列相關(guān)聯(lián)的系統(tǒng)生成的用于干活的線程勾怒。任務(wù)默認(rèn)都是在主線程中執(zhí)行婆排。主線程會去調(diào)度系統(tǒng)資源,確定是否需要開辟新的線程來干活笔链。
  • 同步:針對當(dāng)前線程的任務(wù)的代碼流段只,當(dāng)前線程如果在執(zhí)行任務(wù)的過程中需要同步執(zhí)行一個新的任務(wù)的時候,新任務(wù)會被立即執(zhí)行卡乾,之前沒有執(zhí)行完的任務(wù)會停止執(zhí)行翼悴,進(jìn)入等待狀態(tài)。形成一個阻塞幔妨。
  • 異步: 針對當(dāng)前線程的任務(wù)的代碼流鹦赎,當(dāng)前線程如果在執(zhí)行任務(wù)的過程中需要異步執(zhí)行一個新的任務(wù)的時候,新任務(wù)會被立即執(zhí)行误堡,但是新任務(wù)并不會阻塞當(dāng)前線程古话。

一、串行隊列锁施、同步執(zhí)行

向串行隊列提交同步的任務(wù)的時候的執(zhí)行情況:

let s = DispatchQueue(label: "s")

for i in 0..<5 {
    print("+ 添加任務(wù):\(i)")
    s.sync {
        print("- 執(zhí)行:\(i)")
        print("current: \(i), currentThread: \(Thread.current), isMainThread: \(Thread.current.isMainThread)")
        print("= 執(zhí)行完畢:\(i)")
    }
}
串行隊列同步任務(wù)結(jié)果

通過結(jié)果我們知道:

  • 任務(wù)的情況:(加上了定語:在串行隊列陪踩、同步的)任務(wù)杖们。
  • 主線程的行為:不開辟新的線程在當(dāng)前的主線程中執(zhí)行。
  • 串行的效果:所有任務(wù)的執(zhí)行都是等待上一個任務(wù)執(zhí)行完畢之后再執(zhí)行肩狂。
  • 同步的效果:任務(wù)的執(zhí)行阻塞了當(dāng)前線程(主線程)的代碼流摘完,阻斷了For循環(huán)的進(jìn)行,等任務(wù)執(zhí)行完了才會繼續(xù)For循環(huán)傻谁。

二孝治、串行隊列、異步執(zhí)行

向串行隊列提交異步任務(wù)的執(zhí)行情況:

let s = DispatchQueue(label: "s")

for i in 0..<5 {
    print("+ 添加任務(wù):\(i)")
    s.async {
        print("- 執(zhí)行:\(i)")
        print("current: \(i), currentThread: \(Thread.current), isMainThread: \(Thread.current.isMainThread)")
        print("= 執(zhí)行完畢:\(i)")
    }
}
串行隊列異步執(zhí)行結(jié)果

通過結(jié)果我們知道:

  • 任務(wù)的情況:(加上了定語:在串行隊列审磁、異步的)任務(wù)谈飒。
  • 主線程的行為:開辟新的線程,在 同一個 新的線程中進(jìn)行任務(wù)态蒂。
  • 串行的效果:所有任務(wù)的執(zhí)行都是等待上一個任務(wù)執(zhí)行完畢之后再執(zhí)行杭措。系統(tǒng)非常聰明因為是串行,所以只需要開一個線程就是依次的執(zhí)行了钾恢。
  • 異步的效果:任務(wù)的執(zhí)行沒有阻塞當(dāng)前線程(主線程)的代碼流手素,沒有阻斷For循環(huán)的進(jìn)行,F(xiàn)or循環(huán)始終在執(zhí)行赘那。

三刑桑、并發(fā)隊列、同步執(zhí)行

向并發(fā)隊列中提交同步任務(wù):

let c = DispatchQueue(label: "c", attributes: .concurrent)

for i in 0..<5 {
    print("+ 添加任務(wù):\(i)")
    c.sync {
        print("- 執(zhí)行:\(i)")
        print("current: \(i), currentThread: \(Thread.current), isMainThread: \(Thread.current.isMainThread)")
        print("= 執(zhí)行完畢:\(i)")
    }
}
并發(fā)隊列同步執(zhí)行結(jié)果

我們可以看到募舟,效果和上面的“一”是一樣的祠斧。
通過結(jié)果我們知道:

  • 任務(wù)的情況:(加上了定語:在并發(fā)隊列、同步的)任務(wù)拱礁。
  • 主線程的行為:不開辟新的線程在當(dāng)前的主線程中執(zhí)行琢锋。
  • 并發(fā)的效果:由于沒有開辟新的線程,同步執(zhí)行又阻塞了主線程呢灶,所以吴超,效果還是執(zhí)行完一個任務(wù),然后才開始執(zhí)行下一個任務(wù)鸯乃。
  • 同步的效果:任務(wù)的執(zhí)行阻塞了當(dāng)前線程(主線程)的代碼流鲸阻,阻斷了For循環(huán)的進(jìn)行,等任務(wù)執(zhí)行完了才會繼續(xù)For循環(huán)缨睡。

四鸟悴、并發(fā)隊列,異步執(zhí)行

像并發(fā)隊列中提交異步任務(wù):

let c = DispatchQueue(label: "c", attributes: .concurrent)

for i in 0..<5 {
    print("+ 添加任務(wù):\(i)")
    c.async {
        print("- 執(zhí)行:\(i)")
        print("current: \(i), currentThread: \(Thread.current), isMainThread: \(Thread.current.isMainThread)")
        print("= 執(zhí)行完畢:\(i)")
    }
}
并發(fā)隊列異步執(zhí)行結(jié)果

通過結(jié)果我們知道:

  • 任務(wù)的情況:(加上了定語:在并發(fā)隊列奖年、異步的)任務(wù)细诸。
  • 主線程的行為:開辟新的線程,在 不一定相同 的新的線程中進(jìn)行任務(wù)陋守。由于是并發(fā)且異步震贵,要想實現(xiàn)各個任務(wù)的代碼流的互不干擾不阻塞也不依賴利赋,就需要多開辟一些線程才可以。
  • 并發(fā)的效果:任務(wù)不必等待上一個任務(wù)完成就可以開始執(zhí)行猩系。
  • 異步的效果:任務(wù)的執(zhí)行沒有阻塞當(dāng)前線程(主線程)的代碼流媚送,沒有阻斷For循環(huán)的進(jìn)行,F(xiàn)or循環(huán)始終在執(zhí)行蝙眶。

死鎖

通過上面的各種情況季希,我們就可以引申出死鎖的產(chǎn)生原因以及狀態(tài)了褪那。那就是:
1幽纷、當(dāng)我們向一個 串行隊列 中放入一個 同步執(zhí)行任務(wù)A
2、但是博敬,這個 同步執(zhí)行任務(wù)A 又包括了一個向隊列中放置的 同步執(zhí)行任務(wù)a
3友浸、兩個任務(wù)是嵌套關(guān)系,A執(zhí)行的時候會阻塞當(dāng)前線程已有的任務(wù)偏窝,當(dāng)前線程立即執(zhí)行A任務(wù)
4收恢、但是A任務(wù)里面又包涵一個提交到隊列的同步任務(wù)a
5、這個任務(wù)a是在A之后提交的祭往,由于在串行隊列中伦意,所以a需要等待A完成之后才能執(zhí)行
6、但是a是個同步任務(wù)硼补,提交之后要立即阻塞并且執(zhí)行驮肉。
7、此時A的執(zhí)行被a所阻塞已骇,但是a的執(zhí)行要等A執(zhí)行完畢之后才能執(zhí)行
8离钝、所以最終,A要等a執(zhí)行完畢才能繼續(xù)褪储,a要等A執(zhí)行完了才能開始執(zhí)行
9卵渴、這倆任務(wù)互相等待,導(dǎo)致當(dāng)前線程永遠(yuǎn)停滯不前鲤竹,就發(fā)生了死鎖浪读。

說起來都十分拗口,但是死鎖最終產(chǎn)生的原因就是兩個任務(wù)因為阻塞相互等待的情況辛藻。這也是在使用多線程開發(fā)過程中需要十分注意的地方碘橘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市揩尸,隨后出現(xiàn)的幾起案子蛹屿,更是在濱河造成了極大的恐慌,老刑警劉巖岩榆,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错负,死亡現(xiàn)場離奇詭異坟瓢,居然都是意外死亡,警方通過查閱死者的電腦和手機犹撒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門折联,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人识颊,你說我怎么就攤上這事诚镰。” “怎么了祥款?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵清笨,是天一觀的道長。 經(jīng)常有香客問我刃跛,道長抠艾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任桨昙,我火速辦了婚禮检号,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛙酪。我一直安慰自己齐苛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布桂塞。 她就那樣靜靜地躺著凹蜂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藐俺。 梳的紋絲不亂的頭發(fā)上炊甲,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音欲芹,去河邊找鬼卿啡。 笑死,一個胖子當(dāng)著我的面吹牛菱父,可吹牛的內(nèi)容都是我干的颈娜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浙宜,長吁一口氣:“原來是場噩夢啊……” “哼官辽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粟瞬,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤同仆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裙品,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俗批,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡俗或,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年冰木,在試婚紗的時候發(fā)現(xiàn)自己被綠了枪萄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡负蠕,死狀恐怖干像,靈堂內(nèi)的尸體忽然破棺而出帅腌,到底是詐尸還是另有隱情,我是刑警寧澤麻汰,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布速客,位于F島的核電站,受9級特大地震影響什乙,放射性物質(zhì)發(fā)生泄漏挽封。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一臣镣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧智亮,春花似錦忆某、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至状原,卻和暖如春聋呢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颠区。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工削锰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕莱。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓器贩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朋截。 傳聞我的和親對象是個殘疾皇子蛹稍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354