swift/OC中的死鎖問題

先明確幾個概念吧!異步

&3.2 同步與異步async

串行與並行針對的是隊列,而同步與異步,針對的則是線程。post

最大的區別在於,同步線程要阻塞當前線程,必需要等待同步線程中的任務執行完,返回之後,才能繼續執行下一任務;而異步線程則是不用等待。spa

&3.3 GCD API線程

GCD API不少,這裏僅介紹本文用到的。blog

系統標準提供的兩個隊列隊列

// 全局隊列,一個特殊的並行隊列dispatch_get_global_queue// 主隊列,在主線程中運行,由於主線程只有一個,因此這是一個特殊的串行隊列dispatch_get_main_queue複製代碼get

除此以外,還能夠本身生成隊列同步

// 從DISPATCH_QUEUE_SERIAL看出,這是串行隊列dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL)// 同理,這是一個並行隊列dispatch_queue_create("com.demo.concurrentQueue", DISPATCH_QUEUE_CONCURRENT)複製代碼queue

同步與異步線程的建立:

dispatch_sync(..., ^(block))// 同步線程dispatch_async(..., ^(block))// 異步線程

案例與分析

案例一: 當同步遇到了串行

NSLog(@"1"); // 任務1

dispatch_sync(dispatch_get_main_queue(), ^{

    NSLog(@"2");// 任務2

});

NSLog(@"3"); // 任務3

摘自  http://www.javashuo.com/article/p-tpmdjgpy-bs.html 

 

小結

簡單來講就是,在串行隊列裏添加同步線程(任務),線程中有(task1),task2

敲黑板了!

同步任務會阻塞當前線程而且將任務task1添加到隊列(串行)中.

此時隊列中的順序是:   同步線程   task2   task1 

此時就出現了,先有的蛋仍是先有的雞的問題!

相關文章
相關標籤/搜索