dispatch_sync, dispatch_async和queue的搭配使用

有時(shí)候會(huì)遇到sync,async對(duì)dispatch_get_main_queue,dispatch_queue_create, dispatch_get_global_queue的搭配不是特別的清楚,所以也簡(jiǎn)單的總結(jié)了下。

dispatch_async(異步)和dispatch_sync(同步):決定有沒有開子線程的能力,而不是指會(huì)不會(huì)開子線程。

queue 決定有沒有并發(fā)的能力。開子線程我就并發(fā),不開就串行。

總結(jié)

dispatch_async(異步)有開子線程能力。
dispatch_sync(同步)沒有開子線程能力。

1:dispatch_get_main_queue
都在主線程中按順序執(zhí)行(比較特殊);
2:dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有并發(fā)能力
3:dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
沒并發(fā)能力(串);
4:dispatch_get_global_queue
有并發(fā)能力;

dispatch_async各種搭配后代碼塊中代碼在什么線程中,怎樣執(zhí)行。

1:dispatch_async 和 dispatch_get_main_queue
有開子線程的能力,在主線程中執(zhí)行。
結(jié)果:主線程中按順序執(zhí)行。
2:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有開子線程的能力,有并發(fā)的能力。
結(jié)果:子線程并發(fā)執(zhí)行。
3:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
有開子線程能力,串行執(zhí)行
結(jié)果:子線程串行執(zhí)行。
4:dispatch_async 和 dispatch_get_global_queue
有開子線程能力,有并發(fā)執(zhí)行能力
結(jié)果:子線程并發(fā)執(zhí)行。

dispatch_sync各種搭配后代碼塊中代碼在什么線程中,怎樣執(zhí)行。

1:dispatch_sync 和 dispatch_get_main_queue
沒有開子線程的能力,在主線程中執(zhí)行。
結(jié)果:
若當(dāng)前線程為主線程,則死鎖崩潰(后面細(xì)說)
若當(dāng)前線程為子線程,則在子線程中串行執(zhí)行。
2:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
沒有開子線程的能力,有并發(fā)的能力。
結(jié)果:當(dāng)前線程中串行執(zhí)行。
3:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
沒有開子線程能力,串行執(zhí)行
結(jié)果:當(dāng)前線程中串行執(zhí)行。
4:dispatch_sync 和 dispatch_get_global_queue
沒有開子線程能力,有并發(fā)執(zhí)行能力
結(jié)果:當(dāng)前線程中串行執(zhí)行。

注意:上文提到"當(dāng)前線程"表示當(dāng)前dispatch_sync或者dispatch_async的代碼在什么線程中執(zhí)行并不確定,所以代碼塊中的內(nèi)容在子線程/主線程中執(zhí)行并不確定。
dispatch_sync 和 dispatch_get_main_queue搭配為什么會(huì)造成死鎖呢?請(qǐng)看下一篇文章

有什么錯(cuò)誤歡迎批評(píng)指正 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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