首先,我们来看下下面一个例子:

代码:(串行队列里同步线程嵌套)

    NSLog(@"haha");

    dispatch_queue_t queue = dispatch_queue_create("test", nil);

    dispatch_sync(queue, ^ {

        NSLog(@"xxoo0");

        dispatch_sync(queue, ^ {

            NSLog(@"xxoo1");

        });

        NSLog(@"xxoo2");

    });

运行结果:



2014-08-25 14:30:24.440 test[4424:60b] haha

2014-08-25 14:30:24.441 test[4424:60b] xxoo0




在test串行队列中,有两个同步线程嵌套导致第二个同步线程运行不了,产生了死锁。

原因是:在串行队列中,第二个同步线程要执行,必须等待第一个同步线程执行完成后才可进行,但是第一个同步线程要执行完又得等待第二个同步线程执行完,因为第二个同步线程嵌套在第一个同步线程里,这就造成了两个同步线程互相等待,即死锁。

特别强调:是在串行队列里!






    dispatch_queue_t queue = dispatch_queue_create("test", nil);

这行代码中,第二个参数为nil值,相当与值为DISPATCH_QUEUE_SERIAL,即为串行的。如果把值改成DISPATCH_QUEUE_CONCURRENT,即为并行的,就不会导致两个同步线程死锁。或者使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)也行,因为dispatch_get_global_queue是并行队列。




ok,我们来看第二个例子:




代码:(主线程里的同步线程)



    NSLog(@"haha");

    dispatch_sync(dispatch_get_main_queue(), ^ {

        NSLog(@"xxoo");

    });

运行结果:



2014-08-25 15:01:58.922 test[4797:60b] haha



结果还是死锁,这个例子其实和第一个例子是类似的,主线程其实就是在一个串行队列里的,我们写的这个同步线程就相当与第一个例子的第二个嵌套的同步线程,因为这个同步线程是在主线程里写的,就相当于嵌套在主线程里的。



所以,对于

dispatch_sync(queue, ^{});

这行代码的意义可以概括为: 会阻塞当前线程等待串行queue中的所有任务执行完成后再向下执行。

关于dispatch_sync死锁问题的更多相关文章

  1. 【读书笔记】iOS-GCD-API

    一,Dispatch Queue dispatch_async(queue, ^{ /* *想执行的任务 */ }); 其中queue分为两种: 1,Serial Dispatch Queue 等待现 ...

  2. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁

    1. http://blog.jobbole.com/65028/ 2. - (void)viewDidLoad { [super viewDidLoad]; NSLog("); dispa ...

  3. GCD死锁 多线程

    NSLog("); dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行 // 同步,异步--线程 同步-主线程 // m ...

  4. iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁

      我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...

  5. GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验

    平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesB ...

  6. dispatch_sync may result in dead-lock

    以下代码会引起死锁 dispatch_block_t block = ^{ ; i < ; i++) { NSLog(@"dispatch_sync:%d", i); } } ...

  7. dispatch_async & dispatch_sync

    Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行. dispatch_sync 也是将block发送到指定的线程去执行,但是当 ...

  8. iOS学习笔记-死锁deadlock理解

    1.首先看一下官方文档的解释,这个block的队列是同步执行的,不像异步,这个方法直到block执行完毕才会返回 2.主线程一旦开启,就要先把自己的代码执行完成之后,才去执行加入到主队列中的任务 De ...

  9. (iOS)关于GCD死锁的问题

    - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog("); ...

随机推荐

  1. Random类、ThreadLocalRandom类

    Random和ThreadLocalRandom类均用于生成伪随机数. Random的构造函数: Random()     默认以系统当前时间为种子,相当于Random(System.currentT ...

  2. BigDecimal的加减乘除

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行 ...

  3. 9、数值的整数次方------------>剑指offer系列

    数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 这道题逻辑上很简单,但很容易出错 关键是要考虑全面,考虑到所有情况 ...

  4. 字符串在forEach方法里面可以使用include函数

    今天在写项目的时候,发现了一个问题,使用forEach函数,arr数组里面的字符串可以调用include方法,我查阅了很多地方,string里面没有这个方法. 但是在forEach函数里面确实可以这样 ...

  5. html5 02 随记

    HTML 02 全局通用属性  id  name  class  style 一. 图像标签 标签名:<img  /> 常用属性: Alt -- 代表图像的替代文字 作用: 当图片不显示的 ...

  6. python中__file__

    用__file__ 来获得脚本所在的路径,比如文件在/root下 cat tee #!/usr/bin/env pythonprint __file__              #得到相对路径tee ...

  7. 科学效法自然:微软研究人员测试AI控制的滑翔机

    编者按:正如一颗苹果砸出了万有引力,自然界所有存在的事物和现象都有其科学合理的一面,小小的鸟儿也能够给科学带来丰富的灵感和启示. 最近,微软研究人员从自然出发,研究鸟类能够自由停留在空中的科学原理,并 ...

  8. 10款免费的MySQL数据库图形化管理工具

    绝大多数的关系数据库都明显不同于MS Access,它们都有两个截然不同的部分:后端作为数据仓库,前端作为用于数据组件通信的用户界面.这种设计非常巧妙,它并行处理两层编程模型,将数据 层从用户界面中分 ...

  9. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  10. 反射中 invoke方法 getMethod方法 getClass()方法

    package com.swift; import java.util.*; import java.lang.reflect.*; public class ReflectDemo { public ...