iOS多線程編程之GCD

GCD

在iOS多線程編程中,可以通過官方API,可以自己創(chuàng)建管理線程搜骡,但是用GCD是最直觀簡單高效地使用多線程編程。想要用好GCD佑女,必須清楚理解概念记靡,其中有兩個很重要的概念,隊列同步性

隊列

GCD中的隊列是FIFO团驱,把需要執(zhí)行的任務(wù)以先進(jìn)先出的順序加入隊列中摸吠。
GCD中有兩種隊列,分別是串行隊列以及并行隊列嚎花。

串行隊列:按任務(wù)加入的順序在一個線程內(nèi)線性執(zhí)行寸痢。

// Swift
// 第一種方式
let queue = DispatchQueue(label: "hwhQuene1")  //表示串行隊列
// 第二種方式
let queue = DispatchQueue.main // 因為加入主隊列的任務(wù)只在主線程中執(zhí)行,所以是主隊列是串行隊列

// OC
// 第一種方式
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
// 第二種方式
dispatch_queue_t mainQueue = dispatch_get_main_queue();

并行隊列:按任務(wù)加入的順序在多個線程內(nèi)并發(fā)執(zhí)行紊选。

// swift
// 第一種方式 自己創(chuàng)建一個并行隊列
let queue = DispatchQueue(label: "net.bujige.testQueue",  attributes: .concurrent)  //并行隊列
// 第二種方式 全局隊列啼止,可指定優(yōu)先級
let globalQuene = DispatchQueue.global(qos: .default)

// OC
// 第一種方式
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUQUE_CONCURRENT);
// 第二種方式
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

同步性

同步執(zhí)行:sync函數(shù)會等待里面的處理執(zhí)行結(jié)束后才能返回結(jié)果道逗。即sync函數(shù)將指定的任務(wù)"同步"追加到指定的隊列中,在追加任務(wù)結(jié)束之前献烦,sync函數(shù)會一直等待滓窍。

// Swift
queue.sync {
   // 添加要執(zhí)行的任務(wù)
}

// OC
dispatch_sync(queue, ^{
  // 添加要執(zhí)行的任務(wù)
});

異步執(zhí)行:async函數(shù)會等待里面的處理執(zhí)行結(jié)束后才能返回結(jié)果。即async函數(shù)將指定的任務(wù)"非同步"追加到指定的隊列中巩那,async函數(shù)不做任何等待吏夯,一直往下執(zhí)行。

// Swift
queue.async {
   // 添加要執(zhí)行的任務(wù)
}

// OC
dispatch_async(queue, ^{
  // 添加要執(zhí)行的任務(wù)
});

串行隊列+同步執(zhí)行

串行隊列會把加入隊列中的任務(wù)加入到當(dāng)前執(zhí)行環(huán)境的線程中拢操。如果在當(dāng)前執(zhí)行環(huán)境為主線程锦亦,則把任務(wù)加入主線程中線性執(zhí)行,如果在其他線程中令境,則把任務(wù)加入到其他線程中線性執(zhí)行。

// 在主線程中執(zhí)行
func doInMain() {
       
       print(Thread.current)
       kSserialQueueSync()
       
   }
// 在其他線程中執(zhí)行
func doInOther() {
   
   let serQueue = DispatchQueue(label: "otherQueue")
   
   serQueue.async {
       print(Thread.current)
       self.kSserialQueueSync()
   }
   
}

// 串行 同步
func kSserialQueueSync() {
    
    print("test start")
    
    let serQueue = DispatchQueue(label: "serQueue") //串行
    
    serQueue.sync {
        print("block1")
        print(Thread.current)
    }
    
    serQueue.sync {
        print("block2")
        print(Thread.current)
    }
    
    serQueue.sync {
        print("block3")
        print(Thread.current)
    }
    
    print("test over")
    
}

參考鏈接

Swift

GCD Swift 用法
GCD精講(Swift 3&4)

OC

GCD的Dispatch Queue(串行隊列顾瞪、并發(fā)隊列舔庶、主隊列)
iOS 多線程:『GCD』詳盡總結(jié)
iOS 從一個問題開始說說多線程+死鎖(同步函數(shù)底層)

后續(xù)添加

同步性+隊列 (4種)
GCD其他重要API
信號量的簡單使用

遺留問題

在主線程執(zhí)行環(huán)境下,同步的添加任務(wù)到主隊列下陈醒,會發(fā)生死鎖
在A線程執(zhí)行環(huán)境下惕橙,同步的添加任務(wù)到A隊列下,會發(fā)生死鎖钉跷。A線程是A隊列生成用來執(zhí)行A隊列里面的任務(wù)的線程弥鹦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爷辙,隨后出現(xiàn)的幾起案子彬坏,更是在濱河造成了極大的恐慌,老刑警劉巖膝晾,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓始,死亡現(xiàn)場離奇詭異,居然都是意外死亡血当,警方通過查閱死者的電腦和手機(jī)幻赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臊旭,“玉大人落恼,你說我怎么就攤上這事±胙” “怎么了佳谦?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撤奸。 經(jīng)常有香客問我吠昭,道長喊括,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任矢棚,我火速辦了婚禮郑什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒲肋。我一直安慰自己蘑拯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布兜粘。 她就那樣靜靜地躺著申窘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孔轴。 梳的紋絲不亂的頭發(fā)上剃法,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音路鹰,去河邊找鬼贷洲。 笑死,一個胖子當(dāng)著我的面吹牛晋柱,可吹牛的內(nèi)容都是我干的优构。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼雁竞,長吁一口氣:“原來是場噩夢啊……” “哼钦椭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碑诉,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤彪腔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后联贩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫仆,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年泪幌,在試婚紗的時候發(fā)現(xiàn)自己被綠了盲厌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡祸泪,死狀恐怖吗浩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没隘,我是刑警寧澤懂扼,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響阀湿,放射性物質(zhì)發(fā)生泄漏赶熟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一陷嘴、第九天 我趴在偏房一處隱蔽的房頂上張望映砖。 院中可真熱鬧,春花似錦灾挨、人聲如沸邑退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽地技。三九已至,卻和暖如春秒拔,著一層夾襖步出監(jiān)牢的瞬間莫矗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工溯警, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趣苏,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓梯轻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尽棕。 傳聞我的和親對象是個殘疾皇子喳挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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