从几个例子理解串行并行队列及同步异步任务
2016-04-16 16:44
483 查看
例1
此例死锁。viewDidLoad 和 block 的任务都要在主线程上运行,主线程是串行队列,不能够并发,属于临界资源。block 是同步任务,在block没有执行结束时 dispatch_sync 不会返回,即不能够往下执行。如此,viewDidLoad 占有主线程并等待 block 执行,block 等待获取主线程而阻塞,死锁形成。
例2
此例不会死锁。block 是异步任务,会立即返回,即不管 block 怎样,都会回到 viewDidLoad 继续执行。因为主线程是串行队列,所以 block 一开始会被阻塞而去等待获取主线程。与例1不同的是,block 在 viewDidLoad 任务完成后得到了主线程,所以没有死锁。
例3
此例不会死锁。globe queue 是并行队列,其中的任务可以并发执行,不属于临界资源
- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(),^{ NSLog(@"2"); }); NSLog(@"3"); }
此例死锁。viewDidLoad 和 block 的任务都要在主线程上运行,主线程是串行队列,不能够并发,属于临界资源。block 是同步任务,在block没有执行结束时 dispatch_sync 不会返回,即不能够往下执行。如此,viewDidLoad 占有主线程并等待 block 执行,block 等待获取主线程而阻塞,死锁形成。
例2
- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"1"); dispatch_async(dispatch_get_main_queue(),^{ NSLog(@"2"); }); NSLog(@"3"); }
此例不会死锁。block 是异步任务,会立即返回,即不管 block 怎样,都会回到 viewDidLoad 继续执行。因为主线程是串行队列,所以 block 一开始会被阻塞而去等待获取主线程。与例1不同的是,block 在 viewDidLoad 任务完成后得到了主线程,所以没有死锁。
例3
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ NSLog(@"1"); dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ NSLog(@"2"); }); NSLog(@"3"); });
此例不会死锁。globe queue 是并行队列,其中的任务可以并发执行,不属于临界资源
相关文章推荐
- MVP模式(2) 你真的理解下抽象类和接口吗??
- 第四五六周学习进度
- linux查看内存使用情况
- GIT与SVN混合使用技巧
- RAM&ROM相关知识
- Html5 Cavans之高级内容上篇
- iOS开发-由浅至深学习block
- php实现SESSION跨域
- mvc 中的 [ChildActionOnly] 和 [NonAction]
- ARM NEON编程系列1-导论
- Swift-网络上传请求之Multipart
- 稀疏矩阵的压缩存储和转置
- 结构体指定成员赋值
- Ubuntu 16.04 配置中文输入法
- 【Java集合源码剖析】HashMap源码剖析
- warning malformed '#pragma pack(push[, id], n)' - ignored
- UVALive 6195 —— The Dueling Philosophers Problem
- 堆数据
- 那些年无法一下子看穿的智力题
- C++拷贝构造函数详解