美文网首页
dispatch_sync, dispatch_async和qu

dispatch_sync, dispatch_async和qu

作者: I_YoYo | 来源:发表于2017-08-27 20:01 被阅读123次
    摘要 .

    有时候会遇到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搭配为什么会造成死锁呢?请看下一篇文章

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

    相关文章

      网友评论

          本文标题:dispatch_sync, dispatch_async和qu

          本文链接:https://www.haomeiwen.com/subject/lgkidxtx.html