多线程相关

569 阅读1分钟

1. GCD

1. 同步/异步 串行/并发
dispatch_sync(serial_queue, ^{//任务})

dispatch_async(serial_queue, ^{//任务})

dispatch_sync(concurrent_queue, ^{//任务})

dispatch_async(concurrent_queue, ^{//任务})

  • 死锁
    • 原因
      • 队列引起的循环等待
      • 主队列中所提交的任务无论是同步方式还是异步方式,都要在主线程中执行
      • 同步提交的任务,不论是提交到并发还是串行队列,都在当前线程执行

2. dispatch_barrier_async
  • 并发队列实现多读单写
3. dispatch_group
// 创建一个group
    dispatch_group_t group = dispatch_group_create();
    
    // for循环遍历各个元素执行操作
    for (NSURL *url in arrayURLs) {
        
        // 异步组分派到并发队列当中
        dispatch_group_async(group, concurrent_queue, ^{
            
            //根据url去下载图片
            
            NSLog(@"url is %@", url);
        });
    }
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 当添加到组中的所有任务执行完成之后会调用该Block
        NSLog(@"所有图片已全部下载完成");
    });

2. NSOperation

配合NSOperationQueue实现多线程方案
  • 特点
    • 可以添加任务依赖
    • 任务执行状态控制
      • 状态
        • isReady
        • isExecuting
        • isFinished
        • isCancelled
      • 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
      • 如果重写了start方法,自行控制任务状态
    • 最大并发量
    • 支持KVO

3. NSThread

  • 启动流程
  • 结合Runloop实现常驻线程
  • Start方法

4. 多线程与锁

  • iOS中的锁
    • @synchronized
      • 一般在创建单例对象的时候使用
    • atomic
      • 修饰属性的关键字
      • 对被修饰对象进行原子操作(不负责使用)
    • OSSpinLock
      • 自旋锁
      • 循环等待询问,不释放当前资源
      • 用于轻量级数据访问,简单的int值+1/-1操作
    • NSLock
    • NSRrecursiveLock - 递归锁
    • dispatch_semaphore_t - 信号量
      • dispatch_semaphore_create(1)
        • 内部实现
      • dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
        • 内部实现逻辑
      • dispatch_semaphore_signal(semaphore)
        • 内部