zoukankan      html  css  js  c++  java
  • GCD死锁 多线程

       NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行
            // 同步,异步--线程 同步-主线程
            // main_queue global_queue 串行队列,并发队列
            // 先进先出 3先进的,2后进的,应该先走外面的,但是同步要求
            // 先进先出,任务3先,任务2最后加入队列的,先进先出,等任务3执行,但是任务2是同步任务,
            NSLog(@"2");
        });
        NSLog(@"3");

    GCD:把任务添加到队列queue, 指定执行任务的函数(写在block里面)

    sync会阻塞(必须按顺序执行)线程 同步

    async异步,开线程

    Q:上面代码输出结果是什么?

    A:1

    解释:主线程有3个任务:1,同步任务(主队列),任务3. 显然先输出1,任务2被添加到了主队列,任务2是最后添加的,根据GCD先进先出原则,应该先执行任务3然后执行任务2,但是sync同步阻塞线程,同步要求必须执行完Block内部的任务才能执行之后的任务,即必须先执行任务2然后再执行任务3,这样就造成了死循环,即死锁 deadLock

    参考:http://www.superqq.com/blog/2015/10/16/five-case-know-gcd/

    2021,9,14更新图片:

    主队列是串行队列,先进先出,要求先3再2

    同步线程要求 先2再3;  冲突了


    2018、6、26更新:

    主线程 添加任务的顺序是1,3,同步任务2,

    根据先进先出原则,同步任务2需要执行完任务3再执行       2等待3

    但任务2是同步任务,所以任务3需要任务2执行完毕再执行  3等待2

    所以2,3任务互相等待,死锁了

    总结:同步,串行可能死锁

    https://hit-alibaba.github.io/interview/iOS/Cocoa-Touch/Multithreading.html

    从这个例子可以看出,GCD设置线程间的依赖关系就会嵌套,嵌套很可能会出现死锁,所以为了方便的控制依赖的话,最好使用NSOperation

    NSLog(@"1"); // 任务1
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"2"); // 任务2
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"3"); // 任务3
         sleep(2); }); NSLog(@"4"); // 任务4 }); NSLog(@"5"); // 任务5

     1,5,2,3,4

    5,2顺序不定

    3阻塞4的执行,必须等3执行完才能执行4

  • 相关阅读:
    3秒后页面跳转代码
    数据库 ""和null的在java 持久化中的区别
    去掉标签元素
    hibernate 自动封装
    hql 多对多查询
    javascript 数组
    spring mvc+mybatis整合
    collection映射
    mybatis中one2many
    mybatis中many2one
  • 原文地址:https://www.cnblogs.com/tufei7/p/6044384.html
Copyright © 2011-2022 走看看