dispatch_sync, dispatch_async和queue的搭配使用

有时候会遇到sync,async对dispatch_get_main_queue,dispatch_queue_create, dispatch_get_global_queue的搭配不是特别的清楚,所以也简单的总结了下。

dispatch_async(异步)和dispatch_sync(同步):决定有没有开子线程的能力,而不是指会不会开子线程。

queue 决定有没有并发的能力。开子线程我就并发,不开就串行。

总结

dispatch_async(异步)有开子线程能力。
dispatch_sync(同步)没有开子线程能力。

1:dispatch_get_main_queue
都在主线程中按顺序执行(比较特殊);
2:dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有并发能力
3:dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
没并发能力(串);
4:dispatch_get_global_queue
有并发能力;

dispatch_async各种搭配后代码块中代码在什么线程中,怎样执行。

1:dispatch_async 和 dispatch_get_main_queue
有开子线程的能力,在主线程中执行。
结果:主线程中按顺序执行。
2:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有开子线程的能力,有并发的能力。
结果:子线程并发执行。
3:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
有开子线程能力,串行执行
结果:子线程串行执行。
4:dispatch_async 和 dispatch_get_global_queue
有开子线程能力,有并发执行能力
结果:子线程并发执行。

dispatch_sync各种搭配后代码块中代码在什么线程中,怎样执行。

1:dispatch_sync 和 dispatch_get_main_queue
没有开子线程的能力,在主线程中执行。
结果:
若当前线程为主线程,则死锁崩溃(后面细说)
若当前线程为子线程,则在子线程中串行执行。
2:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
没有开子线程的能力,有并发的能力。
结果:当前线程中串行执行。
3:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
没有开子线程能力,串行执行
结果:当前线程中串行执行。
4:dispatch_sync 和 dispatch_get_global_queue
没有开子线程能力,有并发执行能力
结果:当前线程中串行执行。

注意:上文提到"当前线程"表示当前dispatch_sync或者dispatch_async的代码在什么线程中执行并不确定,所以代码块中的内容在子线程/主线程中执行并不确定。
dispatch_sync 和 dispatch_get_main_queue搭配为什么会造成死锁呢?请看下一篇文章

有什么错误欢迎批评指正 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容