iOSiOS Developer

GCD之线程死锁

2017-06-01  本文已影响6人  踏云小子

GCD Queue 的划分

dispatch_sync 和 dispatch_async 区别

非典型案例一

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"=================4");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"=================5");
    });
    NSLog(@"=================6");
}
解析

dispatch_sync会阻塞当前进程等待里面的block执行完毕,dispatch_get_main_queue会获取当前主线程,而当前主线程不会,正在串行执行的主线程突然加入一个并发,造成死锁

解决方法
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"=================4");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"=================5");
    });
    NSLog(@"=================6");
}

dispatch_async不会立即执行block里面方法,等到主线程执行完了,这时候拿到主线程去NSLog(@"=================5");

非典型案例二

- (void)viewDidLoad
{
    [super viewDidLoad];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
    NSLog(@"=================1");
    
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"=================2");

    });
    NSLog(@"=================3");

    
});

}
解析

dispatch_async不会立即执行block里面方法,等到主线程执行完了,拿到全局队列,同步执行主线程,就不会死锁

上一篇 下一篇

猜你喜欢

热点阅读