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执行完。

  • 相关阅读:
    Convert、Parse、TryParse、(int)区别及可能引发性能问题
    重写、覆盖、重载、多态几个概念的区别分析
    计算机系统的硬件组成(转)
    如何选择Html.RenderPartial和Html.RenderAction
    位运算(转)
    Java程序员面试中的多线程问题
    请转到控制面板来配置或安装系统组件
    开篇
    DropDownList 不能有多个项被选定!
    有关rollup和cube的使用方法讨论
  • 原文地址:https://www.cnblogs.com/jukaiit/p/8018941.html
Copyright © 2011-2022 走看看