关于dispatch_sync死锁问题
首先,我们来看下下面一个例子:
代码:(串行队列里同步线程嵌套)
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死锁问题的更多相关文章
- 【读书笔记】iOS-GCD-API
一,Dispatch Queue dispatch_async(queue, ^{ /* *想执行的任务 */ }); 其中queue分为两种: 1,Serial Dispatch Queue 等待现 ...
- 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁
1. http://blog.jobbole.com/65028/ 2. - (void)viewDidLoad { [super viewDidLoad]; NSLog("); dispa ...
- GCD死锁 多线程
NSLog("); dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行 // 同步,异步--线程 同步-主线程 // m ...
- iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁
我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...
- GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验
平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesB ...
- dispatch_sync may result in dead-lock
以下代码会引起死锁 dispatch_block_t block = ^{ ; i < ; i++) { NSLog(@"dispatch_sync:%d", i); } } ...
- dispatch_async & dispatch_sync
Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行. dispatch_sync 也是将block发送到指定的线程去执行,但是当 ...
- iOS学习笔记-死锁deadlock理解
1.首先看一下官方文档的解释,这个block的队列是同步执行的,不像异步,这个方法直到block执行完毕才会返回 2.主线程一旦开启,就要先把自己的代码执行完成之后,才去执行加入到主队列中的任务 De ...
- (iOS)关于GCD死锁的问题
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog("); ...
随机推荐
- sqlserver创建触发器
Create TRIGGER [dbo].[tr_Delete_AllocationedDN] --删除指定账户已分配未拣货的任务 ON [dbo].[FRU_PickLocationNew] --触 ...
- jsp另外五大内置对象之-out获取缓冲区大小
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
证明看这http://hihocoder.com/contest/hiho44/problem/1 思路: 设 sg=a[1]^a[2]^...a[n],若sg=0,则先手Alice必败,否则必赢. ...
- 打开某exe提示"应用程序无法启动,因为应用程序的并行配置不正确……"的解决方案
本人在新安装好了的windows server 2008 r2 (64位)上运行“RefilesName V2.0(文件批量改名).exe”,结果提示: 应用程序无法启动,因为应用程序的并行配置不正确 ...
- Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.co ...
- UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
非常适合A*的一道题. 比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量. #include<cstdio> #include<cstring> #include< ...
- 【转】ios -- ViewController跳转+传值(方式一)
方式一:通过定义一个实体类传值 (从ViewController1 跳转至 ViewController2) 1.定义实体类NotificationEntity .h声明文件 #import < ...
- kubernetes-平台日志收集(ELK)
使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost ...
- 虚IP切换原理
高可用性HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性.HA系统是目前企业防止核心计算机系统因故 ...
- C09 指针
目录 指针相关概念 指针变量 null指针 指针的算术运算 指针数组 指向指针的指针 传递指针给函数 从函数返回指针 指针相关概念 变量 如果在程序中定义了一个变量,在对程序进行编译时,系统就会为这个 ...