美文网首页
多线程知识整理2

多线程知识整理2

作者: 化二缺 | 来源:发表于2020-07-03 15:50 被阅读0次

    NSConditionLock

    • 是对NSCondition的进一步封装。可以设置具体条件


      image.png

    dispatch_queue

    • 直接使用GCD的串行队列,也可以实现线程同步

    DISPATCH_QUEUE_SERIAL

    dispatch_semaphore

    • semaphore 信号量
    • 信号量的初始值,可以用来控制线程并发访问的最大数量
    • 信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步


      image.png

    @synchronized

    @synchronized 是对mutex递归锁的封装

    //苹果不推荐使用 因为性能不好 
    
    @sychronized(self){
       [self doSomething];
    }
    ---------------------------
    // 保证锁不变 
    
    static NSObject * lock;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        lock = [[NSObject alloc] init];
    });
    @synchronized(lock){
         [self doSomething];
    }
    
    
    

    iOS线程同步方案性能比较

    image.png

    //更推荐使用 dispatch_semaphore 和 pthread_mutex

    自旋锁 互斥锁 比较

    • 什么情况使用自旋锁比较划算?

    预计线程等待锁的时间很短
    加锁的代码经常被调用,但竞争情况很少发生
    CPU资源不紧张
    多核处理器

    • 什么情况使用互斥锁比较划算?

    预计线程等待锁的时间较长
    单核处理器
    临界区有IO操作
    临界区代码复杂或者循环量大
    临界区竞争非常激烈的

    atomic

    • 保证getter setter 原子操作
    • 相当于在getter和setter 内部加了线程同步的锁
    • 并不能保证使用属性的过程是线程安全的
    • iOS 上很少使用,因为频繁的调用会非常耗损性能

    读写安全方案

    image.png
    image.png

    pthread_rwlock 读写锁

    • 等待锁的线程会进入休眠


      image.png

    dispatch_barrier_async

    • 这个函数传入的并发队列必须是自己通过dispatch_queue_create创建的
    • 如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果


      image.png

    相关文章

      网友评论

          本文标题:多线程知识整理2

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