美文网首页
多线程知识整理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