美文网首页
多线程之死锁

多线程之死锁

作者: 简洁的想法 | 来源:发表于2017-06-27 14:04 被阅读3次

    死锁场景

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSThread *thread = [NSThread currentThread];
        NSLog(@"** 当前线程:%@ **",thread);
        
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSThread *thread = [NSThread currentThread];
            NSLog(@"** 主线程:%@ **",thread);
        });
    }
    

    解释

    一共有 2 个任务,任务 A(正在执行源代码) 是把任务 B 添加到主线程,并且要等到任务 B(block中的任务) 执行完毕。但是任务 A 正在占用主线程,所以任务 B 无法执行。所以任务 A 也无法完成。

    同步和异步

    1.异步调度 dispatch_async : 把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态

    2.同步调度 dispatch_sync : 把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.

    所以,异步调度和同步调度的区别不在于被添加的任务怎样执行,而在于调用线程是否等待任务执行完。

    注意:串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)

    参考:

    关于GCD中的串行,并行,同步,异步

    相关文章

      网友评论

          本文标题:多线程之死锁

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