关于GCD中同步函数+主队列产生死锁的一点理解
2017-06-15 04:48
288 查看
首先看个产生死锁的代码
上述代码中是不会执行到 NSLog(@”end”) 将 end 打印出来的, 当然,再开一条线程来执行syncMain是不会产生死锁
原因解释
同步函数与主队列的特点
同步函数 dispatch_sync : 立刻执行,并且必须等这个函数执行完才能往下执行
主队列特点:凡是放到主队列中的任务,都会放到主线程中执行..如果主队列发现当前主线程有任务在执行,那么主队列会暂停调度队列中的任务,直到主线程空闲为止
综合同步函数与主队列各自的特点,不难发现为何会产生死锁的现象,主线程在执行同步函数的时候主队列也暂停调度任务,而同步函数没有执行完就没法往下执行…简陋的解决办法,上文提到.要么不这么用.
-(void)syncMain{ //获得主队列 dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@"start"); //同步函数 dispatch_sync(queue, ^{ NSLog(@"------ %@",[NSThread currentThread]); }); NSLog(@"end"); }
上述代码中是不会执行到 NSLog(@”end”) 将 end 打印出来的, 当然,再开一条线程来执行syncMain是不会产生死锁
原因解释
同步函数与主队列的特点
同步函数 dispatch_sync : 立刻执行,并且必须等这个函数执行完才能往下执行
主队列特点:凡是放到主队列中的任务,都会放到主线程中执行..如果主队列发现当前主线程有任务在执行,那么主队列会暂停调度队列中的任务,直到主线程空闲为止
综合同步函数与主队列各自的特点,不难发现为何会产生死锁的现象,主线程在执行同步函数的时候主队列也暂停调度任务,而同步函数没有执行完就没法往下执行…简陋的解决办法,上文提到.要么不这么用.
相关文章推荐
- 关于GCD 队列,同步异步的理解
- 关于GCD线程死锁的一点儿理解
- 关于用优先级队列和树解决中缀表达式计算的一点比较
- [zt]关于左值"lvalue"和右值"rvalue"的一点理解
- 关于龙芯拿MIPS授权的一点理解
- 关于AS3中弱引用的一点理解(转载)
- 关于AS3中弱引用的一点理解
- 关于DataRow和DataColumn的一点个人简单理解
- 关于unix下实际用户ID、有效用户ID、设置用户ID、文件所有者ID的一点理解
- 一个草根关于OO的一点理解
- 关于StrutsFormBean 的一点理解
- 关于在数据库中存储层次数据的一点看法与理解
- 关于BMP图片的一点理解,读取图象数据到数组
- 关于KMP算法的一点个人理解
- 关于 a:active 的一点理解 [CSS]
- 我的一点浅见——关于机器的理解
- 关于 *Object 的一点理解,肯定不全对 希望和大家交流
- 关于博弈论中的共同知识的一点理解
- 关于安全共性服务构件的一点理解
- 关于Asp.net web控件事件处理的一点理解