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

  • 相关阅读:
    将SpringBoot应用Docker化并部署到SAP云平台
    另一种办法直接在宿主机上的文件夹内查看Docker镜像运行的日志文件
    Dockerfile里的VOLUMES关键字
    Effective C++笔记(三):资源管理
    Denoise Autoencoder简单理解
    Visual Tracking with Fully Convolutional Networks
    Effective C++笔记(二):构造/析构/赋值运算
    effective c++读书笔记(一)
    Robust Online Visual Tracking with a Single Convolutional Neural Network
    C++卷积神经网络实例(一)
  • 原文地址:https://www.cnblogs.com/jukaiit/p/8018941.html
Copyright © 2011-2022 走看看