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

  • 相关阅读:
    数据库产生的背景
    VS2008执行MFC程序,提示microsoft incremental linker已停止工作解决方法
    leetcode第一刷_Add Binary
    【MongoDB】深入了解MongoDB不可不知的十点
    哈理工2015暑假训练赛 zoj 2078Phone Cell
    dpdk l2fwd 应用流程分析
    在Redhat Linux中执行非Redhat的Openstack, Redhat将对其Linux不提供支持
    Wing IDE 怎样设置 python版本号
    Shell编程入门
    通达OA 小飞鱼OA实施法:以项目管理的方式来推进工作流设计项目实施
  • 原文地址:https://www.cnblogs.com/jiuyi/p/10247920.html
Copyright © 2011-2022 走看看