NSLog(@"");
dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行
// 同步,异步--线程 同步-主线程
// main_queue global_queue 串行队列,并发队列
// 先进先出 3先进的,2后进的,应该先走外面的,但是同步要求
// 先进先出,任务3先,任务2最后加入队列的,先进先出,等任务3执行,但是任务2是同步任务,
// dispatch_get_global
NSLog(@"");
});
NSLog(@"");

GCD:把任务添加到队列queue, 指定执行任务的函数(写在block里面)

sync会阻塞(必须按顺序执行)线程 同步

async异步,开线程

Q:上面代码输出结果是什么?

A:1

解释:主线程有3个任务:1,同步任务(主队列),任务3. 显然先输出1,任务2被添加到了主队列,任务2是最后添加的,根据GCD先进先出原则,应该先执行任务3然后执行任务2,但是sync同步阻塞线程,同步要求必须执行完Block内部的任务才能执行之后的任务,即必须先执行任务2然后再执行任务3,这样就造成了死循环,即死锁 deadLock

参考:http://www.superqq.com/blog/2015/10/16/five-case-know-gcd/


2018、6、26更新:

主线程 添加任务的顺序是1,3,同步任务2,

根据先进先出原则,同步任务2需要执行完任务3再执行       2等待3

但任务2是同步任务,所以任务3需要任务2执行完毕再执行  3等待2

所以2,3任务互相等待,死锁了

总结:同步,串行可能死锁

https://hit-alibaba.github.io/interview/iOS/Cocoa-Touch/Multithreading.html

从这个例子可以看出,GCD设置线程间的依赖关系就会嵌套,嵌套很可能会出现死锁,所以为了方便的控制依赖的话,最好使用NSOperation

NSLog(@"1"); // 任务1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2"); // 任务2
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3"); // 任务3
     sleep(2);
});
NSLog(@"4"); // 任务4
});
NSLog(@"5"); // 任务5

1,5,2,3,4

5,2顺序不定

3阻塞4的执行,必须等3执行完才能执行4

GCD死锁 多线程的更多相关文章

  1. 五个案例让你明白GCD死锁(转)

    转自:http://ios.jobbole.com/82622/ 死锁一直都是在使用多线程时,需要注意的一个问题.以前对同步.异步,串行.并行只有一个模糊的概念,想想也是时候整理一下了.再看看之前的博 ...

  2. GCD与多线程

    GCD与多线程 GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务. GCD中的 ...

  3. iOS-----使用GCD实现多线程

    使用GCD实现多线程 GCD的两个核心概念如下: 队列 队列负责管理开发者提交的任务,GCD队列始终以FIFO(先进先出)的方式来处理任务---但 由于任务的执行时间并不相同,因此先处理的任务并一定先 ...

  4. apple平台下的objc的GCD,多线程编程就是优雅自然。

    在apple的操作系统平台里,GCD使得多线程编程是那么的优雅自然.在传统的多线程编程中,首先要写线程处理循环:之后还有事件队列,消息队列:还要在线程循环中分离事件解释消息,分派处理:还要考虑线程间是 ...

  5. iOS开发——高级篇——多线程GCD死锁

    面试题 请问以下代码打印结果: - (void)interview01 { // 以下代码是在主线程执行的 NSLog(@"执行任务1"); dispatch_queue_t qu ...

  6. GCD网络多线程---同步运行,异步运行,串行队列,并行队列

    总结:同步(无论是串行还是并行)----不又一次开辟子线程 异步(无论是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global ...

  7. GCD的多线程实现方式,线程和定时器混合使用

    GCD (Grand Central Dispatch) 性能更好,追求性能的话 1.创建一个队列 //GCD的使用 //创建一个队列 dispatch_queue_t queue = dispatc ...

  8. iOS开发中GCD在多线程方面的理解

    GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...

  9. [转]关于GCD与多线程

    GCD是什么,你知道吗?你知道了GCD,你确定你会使用吗? 这一篇文章是站在初学者角度去分析GCD,原因是这个很多iOS开发者根本就没用过,即使用过,不知道其中的原理.讲解之前认识一下什么是线程,为什 ...

随机推荐

  1. php libevent 扩展使用示例

    <?php define()); define()); class epoll{ private static $socket; public static $connections; priv ...

  2. iOS 引入framework的常见问题和原理

    今天在引入第三方framework时,我按照以前的方法,把framework加入到了下图的地方: 默认是required的,之后程序就crash了,报错dyld: Library not loaded ...

  3. PHP 面向对象

    封装与不封装的区别:   未封装 时 外部随意更改数据   数据 不需要判定 就可以执行    外部直接操作数据 封装:  外部同样可以对数据更改,但需要 调用  类里面的  函数  外部间接操作数据 ...

  4. jquery 键盘回车事件

    <input id="search" placeholder="输入要领用的资产条码" id="scanCode" type=&quo ...

  5. Fiddler

    Fiddler教程: 原文:http://kb.cnblogs.com/page/130367/

  6. CSS3颜色渐变模式

       1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...

  7. RISC指令集的五个周期

    RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...

  8. [LeetCode] Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  9. [BI项目记]-DB脚本同步

    BI项目中会有很多不同种类的项目,其中比较比较大的一部分就是对DB脚本的处理.然而DB的脚本毕竟无法在项目中进行维护,所以这里介绍如何对DB的脚本进行版本上的维护. 数据库脚本本身没有项目模板支持,很 ...

  10. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...