GCD之线程死锁

GCD Queue 的划分

  • The main queue :主队列,主线程就是在个队列中,是串行队列,dispatch_get_main_queue()

  • Global queues : 全局并发队列,dispatch_get_global_queue(0, 0)

  • 用户队列:是用函数 dispatch_queue_create 创建的自定义队列

dispatch_sync 和 dispatch_async 区别

  • dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。

  • dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。

非典型案例一

- (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里面方法,等到主线程执行完了,拿到全局队列,同步执行主线程,就不会死锁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容