#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//示例1.
/*
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
}) ;
NSLog(@"3");
//以上代码只会打印1
// 造成死锁的原因:
//1. dispatch_sync在等待block语句执行完成,而block语句需要在主线程中执行,所以dispatch_sync 如果在主线程中调用就会造成死锁
//2.dispatch_sync是同步的本身就会阻塞当前线程,也即主线程,而又往主线程里添加一个block,所以也会发生死锁
*/
//示例2.
NSLog(@"1");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
//总结:
/**
*1.分析以上代码view Didload 在主线程中,,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步线程,sync会等到后面的block执行完成才返回。sync又在主队列里面,是个串行队列,sync是后面才加入的,前面一个是主线程,所以sync想执行block必须等待前一个主线程执行完成,而主线程却在等待sync返回,去执行后续工作,从而造成死锁。
*2.dispatch_sync 和 dispatch_async 区别:
dispatch_async(queue,block) async异步队列,dispatch_async函数会立即返回, block会在后台异步执行。
dispatch_sync(queue,block) sync同步队列,dispatch_sync函数不会立即返回,即阻塞当前线程,等待 block同步执行完成。
*3.GCD队列的三种形势
(1) The main queue:主队列,主线程就是在这个队列中
(2) Global queue:全局并发队列
(3) 用户队列:是用函数 dispatch_queue_create 创建的自定义队列
*/
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
网友评论