美文网首页
iOS 多线程基础

iOS 多线程基础

作者: jemmy_xl | 来源:发表于2018-05-21 16:26 被阅读5次

    1、产生死锁的条件:

    产生死锁的四个必要条件:
    (1) 互斥条件:一个资源每次只能被一个进程使用。
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
    (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
    这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
    一不满足,就不会发生死锁。

    在 iOS 并发编程中,我们要知道这几个基本概念:

    串行(Serial):在固定时间内只能执行单个任务。例如主线程,只负责 UI 显示。

    并发(Concurrent):在固定时间内可以执行多个任务。注意,它和并行(Parallel)的区别在于,并发不会同时执行多个任务,而是通过在任务间不断切换去完成所有工作。

    同步(Sync):会把当前的任务加入到队列中,除非该任务执行完成,线程才会返回继续运行,也就是说同步会阻塞线程。任务在执行和结束一定遵循先后顺序,即先执行的任务一定先结束。

    异步(Async):会把当前的任务加入到队列中,但它会立刻返回,无需等任务执行完成,也就是说异步不会阻塞线程。任务在执行和结束不遵循先后顺序。可能先执行的任务先结束,也可能后执行的任务先结束。

    同步&异步

    同步: 不能开启新的线程
    异步: 能开启新线程

    串行队列&并行队列 (都是按照FIFO执行顺序)

    串行队列:任务以FIFO从队列里面一个一个执行。一个任务执行完毕后,才执行下一个任务。(在串行队列最多只会开一个线程)
    并发队列:任务以FIFO在队列中出去,然后并发运行。执行完成的顺序不可控。

    20170409205242880.png
    在主队列中添加同步任务会产生死锁,进而导致程序崩溃。
     dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"main==%@", [NSThread currentThread]);
        });
    

    block 要在主线程中执行。主线程是串行队列,在等block执行完成。所以block 执行不了。

    在全局队列
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"==%@", [NSThread currentThread]);
        });
    

    global是并发队列,不用等block 执行完成才返回。block可以执行,没有问题。

    相关文章

      网友评论

          本文标题:iOS 多线程基础

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