关于GCD中同步函数+主队列产生死锁的一点理解
Posted dashengios
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于GCD中同步函数+主队列产生死锁的一点理解相关的知识,希望对你有一定的参考价值。
首先看个产生死锁的代码
-(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中同步函数+主队列产生死锁的一点理解的主要内容,如果未能解决你的问题,请参考以下文章
iOS底层探索之多线程—GCD源码分析(函数的同步性异步性单例)
主队列中添加的同步操作(dispatch_sync)永远不会被执行,会死锁原因