zoukankan      html  css  js  c++  java
  • dispatch_sync和dispatch_async的区别

    dispatch_sync 线程同步、dispatch_async线程异步

        //同步
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"dispatch_sync - 1");
        });
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"dispatch_sync - 2");
        });
        
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"dispatch_sync - 3");
        });
        
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"dispatch_sync - 4");
        });

    这些代码输出的结果是 1 2 3 4 依次输出、无论你运行多少次都会是这一种结果

    但是来看下面的异步呢?

    //并行队列、同步
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"1");
        });
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"2");
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"3");
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"4");
        });

    输出的结果是 1 2 3 4 随机输出、有时 2 1 3 4  有时  1 3 2 4 等

    在iOS中是无法使用 dispatch_sync(dispatch_get_main_queue() 

    原因如下:

    在iOS使用 dispatch_sync(dispatch_get_main_queue()^(){block体});

    dispath向主队列加一个同步的block;

    此时主队列在等待    dispatch_sync(dispatch_get_main_queue(),^(){block体});执行

    dispatch_sync在等待主队列执行完毕。

    所以在此过程中,我们最初调用的dispatch_sync函数一直得不到返回,main queue被阻塞,而我们的block又需要等待main queue来执行它。造成死锁。

     

    在iOS 使用主队列 dispatch_get_main_queue() 时 应该使用异步执行

    dispatch_async(dispatch_get_main_queue(), ^(){
       NSLog(@"222");
    });

    dispatch_sync  :调用用    dispatch_sync的线程会等dispatch_sync的对内容执行完再继续执行。

    dispatch_async :调用dispatch_async的线程不会的等dispatch_async的内容,自己继续执行。

    sync/async的区别在于 调用diapatch的线程是否等待dispatch执行完。

  • 相关阅读:
    jQuery对select操作
    左眼跳跳 100万
    [推荐] 世界上最健康的作息时间表
    放弃了mapbar 选用google map
    记录
    WPF等待窗口
    PL界面
    C# 获得随机数
    组合
    delphi版淘小宝图片下载工具
  • 原文地址:https://www.cnblogs.com/jiuyi/p/10247920.html
Copyright © 2011-2022 走看看