GCD之线程死锁

作者: 踏云小子 | 来源:发表于2017-06-01 23:22 被阅读6次

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

相关文章

  • 2019 iOS面试题-----进程、线程、多进程、多线程、任务

    2019 iOS面试题-----多线程相关之GCD、死锁、dispatch_barrier_async、dispa...

  • GCD之线程死锁

    GCD Queue 的划分 The main queue :主队列,主线程就是在个队列中,是串行队列,dispa...

  • GCD之线程死锁

    GCD确实实用,很强大,相比NSOperation无法提供取消任务的功能。 But如此强大的工具用不好可能出现线程...

  • 带你分分钟了解GCD多线程的死锁

    带你了解GCD多线程的死锁 阐述: 1.什么是GCD? GCD,全称 Grand Central Dispatch...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • GCD避免死锁的三要素

    平时总在用GCD,但你知不知道,GCD一不小心就会出现死锁,如果死锁在主线程上,整个程序就完了,所以避免死锁是我们...

  • GCD线程死锁

    GCD 以下情况下会死锁,(不考虑线程锁的情况下) 主队列中同步添加任务。 串行队列任务中添加同步任务 为什么呢?...

  • GCD线程死锁

    GCD简化了多线程的使用,但使用不当会导致线程死锁。 dispatch_async(queue,block) a...

  • GCD线程死锁

    先看?一段代码 有什么问题?这段程序应该怎么执行?是one-two-three还是one-three-two? 线...

  • GCD线程死锁

    dispatch_sync是同步线程,若当前线程运行在主线程里面,那就是主线程。然后,在主线程执行log。此时,d...

网友评论

    本文标题:GCD之线程死锁

    本文链接:https://www.haomeiwen.com/subject/belyfxtx.html