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. iOS创建自定义的xib视图,不带控制器调用

    1 我们平常使用视图都是在控制器中加载各种视图,但是有时候一个单独的视图,弄一个控制器未免有些显得太沉重了,所以我们现在来创建一个带xib加载视图的自定义视图 2 创建一个视图类集成uiview 3 ...

  2. Git私钥openssh格式转ppk

    已有my.openssh私钥文件,以及Key passphrase:4c264a73544ee7f3bc6ba6f8a416b6efec9d7cc6e71b745c479159cc7ee0a8cb 若 ...

  3. 一张图说明CDN网络的原理

    原文: http://blog.csdn.net/coolmeme/article/details/9468743 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓 ...

  4. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  5. 【Java EE 学习 27】【oracle学习第一天】

    一.oracle 11g安装的注意事项 1.超级管理员密码设置要符合要求(特别是不能以数字打头),否则在创建数据库的时候会产生ora-00922错误以及ora-28000错误. 解决方法:http:/ ...

  6. Windows 10 使用C#如何将IE设置为默认浏览器

    在WPF XBAP项目中遇到这样一个问题,程序在Windows 10上面无法运行.原因是因为Windows 10默认浏览器是Edge,而XBAP程序是需要在IE上面运行的.于是开始想办法修改Windo ...

  7. WPF MVVM中在ViewModel中关闭或者打开Window

    这篇博客将介绍在MVVM模式ViewModel中关闭和打开View的方法. 1. ViewModel中关闭View public class MainViewModel { public Delega ...

  8. 二分K-means算法

    二分K-means聚类(bisecting K-means) 算法优缺点: 由于这个是K-means的改进算法,所以优缺点与之相同. 算法思想: 1.要了解这个首先应该了解K-means算法,可以看这 ...

  9. Asp.Net MVC4 + Oracle + EasyUI 学习 第二章

    Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...

  10. 管理node的版本

    检查当前node的版本 node -v 清除npm cache sudo npm cache clean -f 安装n模块 sudo npm install -g n 切换到别的版本,比如 v4.4. ...