多线程

作者: BigBossZhu | 来源:发表于2019-08-14 17:30 被阅读0次

    1. 什么是多线程?
    多线程指一个进程有多个线程正在执行.
    2. 提供了哪些多线程技术方案?
    1. GCD
    2. NSOperation
    3. NSThread
    4. 多线程与锁.

    3. GCD:
    1. 同步/异步,串行/并发?
    2. dispatch_barrier_async
    3. patch_group.

    同步/异步,串行/并发?
    此处涉及两个概念,一个是队列,一个是线程.队列,队列特性:先进先出.主队列,全局队列(main_queue分配到主线程中处理和执行的任务,默认代码都是在主队列中执行),并发队列,串行队列.线程分为主线程和其他线程.

    1. 同步串行:dispatch_sync(serial_queue,^{//任务});
    2. 异步串行:dispatch_async(serial_queue,^{//任务});
    3. 同步并发:dispatch_sync(concurrent_queue,^{//任务});
    4. 异步并发:dispatch_async(concurrent_queue,^{//任务});
    

    同步:只要是以同步方式提交,不论是串行和是并发都是在当前线程去执行.
    异步提交:在其他线程提交.
    并发队列:提交到并发队列的所有任务都可以并发去执行.并发执行的意思是,一个任务在执行中,另外的任务加进来也能继续一起执行.
    串行队列:先进先出.

    performSelector例子:GCD子线程执行处理,默认情况下是没有开启子线程提交到runloop的.

    dispatch_barrier_async():异步栅栏调用.形象理解读写分离
    思考:怎么利用GCD来实现多读单写.
    1. 解决读者和读者可以并发访问读取数据.
    2. 读者和写者互斥.
    3. 写者和写者互斥.
    创建并发队列.
    并发队列读取:dispatch_sync(concurrent_queue,^{//读取操作});
    并发队列写入:dispatch_barrier_async(concurrent_queue,^{//写入操作});

    dispatch_group_async():
    思考:使用GCD实现:A,B,C三个任务并发执行,完成后执行任务D.
    1. 创建并发队列
    2. 创建group
    3. dispatch_group_async(group,concurrent_queue,^{//多个任务执行});第一个并发异步执行,指定多个任务在同一个group内.
    4. dispatch_group_notify(group,dispatch_get_main_queue,^{//组队列中所有任务异步执行完成才会调用执行});

    4.NSOperation
    需要和NSOperationQueue配合使用来实现多线程方案.
    特点:1. 添加任务依赖.
    2. 任务执行状态的控制.
    3. 控制最大并发量.MaxCount

    1. isReady:当前任务是否处于就绪状态
    2. isExecuting:当前任务是否处于执行状态
    3. isFinished:当前任务是否已完成
    4. isCancelled:当前任务是否已取消.
      状态控制:
      如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
      如果重写start方法,自行控制任务状态.
      系统是怎样移除一个isFinished=YES的NSOperation的呢?通过源码发现是通过KVO监听.

    5.NSThread.
    启动流程:通过源码分析,调用start()->创建pthread->main()->[target performSelector:selector]在这里可以维护一个RunLoop实现常驻线程->exit().

    6. 锁:
    iOS当中都有哪些锁?
    1. @synchronized单例对象中使用
    2. atomic原子性.不负责使用.能保证赋值安全,不保证使用安全.可变数组指针指向保证安全,但是进行addobject不能保证线程安全.
    3. OSSpinLock:自旋锁,循环等待访问,不释放当前资源.轻量数据访问,内存管理.引用计数+1,-1操作.
    4. NSLock:普通锁,互斥事件线程同步中使用.
    5. NSRecursiveLock递归锁.
    6. dispatch_semaphore_t:信号量是一种锁.
    1. dispatch_semaphore_creat():创建semaphore结构体
    2. dispatch_semaphore_wait():阻塞是主动行为
    3. dispatch_semaphore_singal():如果当前线程没有获取到信号量会继续阻塞,唤醒是被动行为,由释放信号的线程来唤醒被阻塞的线程n

    相关文章

      网友评论

          本文标题:多线程

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