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

  • 相关阅读:
    vsftpd被动模式配置
    CentOS 6.4 服务器版安装教程(超级详细图解)
    CentOS 5.4 安装和卸载桌面
    CentOS 删除桌面环境
    centos x64 vsftpd 530登陆错误问题
    [CentOS] CentOS for vsftpd with MySQL Virtual user
    vsftp 无法启动,500 OOPS: bad bool value in config file for: anonymous_enable
    第二章 创建对话框
    error: no matching function for call to 'Ui::GoToCellDialog::setupUi(QDialog*&)' ui.setupUi(dialog); ^
    第一章 Qt入门
  • 原文地址:https://www.cnblogs.com/jukaiit/p/8018941.html
Copyright © 2011-2022 走看看