美文网首页
第三章 3.2.8 dispatch_sync

第三章 3.2.8 dispatch_sync

作者: MrSYLong | 来源:发表于2018-07-25 21:54 被阅读3次

    dispatch_async函数的“async”意味着“非同步”,将指定的Block非同步的追加到指定的Dispatch Queue中,不用等待Block处理执行结束。

    dispatch_sync函数的“sync”意味着“同步”,将指定的Block同步的追加到指定的Dispatch Queue中,等待Block处理执行结束,“等待”意味着当前线程停止,也就是说,执行dispatch_sync函数所在的Dispatch Queue的线程停止,等待dispatch_sync函数的Block处理在第一个参数Dispatch Queue中的线程中执行结束。

    // 执行Main Dispatch Queue时,使用Concurrent Dispatch Queue进行处理,处理结束后立即使用所得到的结果。
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue, ^{
        NSLog(@"处理");
    });
    
    说明:dispatch_sync函数所在的Dispatch Queue就是默认的Main Dispatch Queue。
    

    dispatch_sync函数使用简单,也很容易引起死锁问题。

    // 例子1
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"处理");
    });
    
    // 例子2
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        dispatch_sync(queue, ^{
            NSLog(@"处理");
        });
    });
    
    说明:两个例子中,dispatch_sync函数所在Main Dispatch Queue的主线程停止,等待Block处理在 Main Dispatch Queue的主线程中执行结束,死锁。
    

    Serial Dispatch Queue也会引起死锁的问题。

    dispatch_queue_t queue = dispatch_queue_create("com.example.gdc.mySerialDispatchQueue", NULL);
    dispatch_async(queue, ^{
        dispatch_sync(queue, ^{
            NSLog(@"处理");
        });
    });
    
    说明:dispatch_sync所在的Serial Dispatch Queue的线程停止,等待追加的Block处理在Serial Dispatch Queue的线程中执行结束,Serial Dispatch Queue只有一个线程,死锁。
    

    总结:dispatch_sync函数所在的Dispatch Queue,不能和其第一个参数Dispatch Queue是同一个Serial Dispatch Queue。

    相关文章

      网友评论

          本文标题:第三章 3.2.8 dispatch_sync

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