多线程

290 阅读2分钟

1.同步和异步决定是不是开新线程

同步:在当前线程中执行任务,不具备开启新线程的能力,要求立即执行才能往下走
异步:在新的线程中执行任务,具备开启新线程的能力

2.串行和并发的主要影响:任务的执行方式

 并发:多个任务并发(同时)执行
 串行:一个任务执行完毕后,再执行下一个任务

3.各种队列执行效果

4.performSelector:withObject:afterDelay:的本质是往 RunLoop 中添加定时器,子线程默认没有启动 RunLoop

5.iOS 中的线程同步方案

6.OSSpinLock叫做‘自旋锁’,等待锁的线程会处于忙等(busy-wait)状态,一直占用着 CPU 资源,目前已经不再安全,可能会出现优先级反转问题,busy-wait的好处是不会让线程睡眠。

7.OSSpinLock的使用

OSSpinLock lock = OS_SPINLOCK_INIT;
OSSpinLockLock(&lock);
OSSpinLockUnlock(&lock);

8.os_unfair_lock 取代不安全的 OSSpinLock,从 iOS10 开始支持,从底层调用看,等待 os_unfail_lock 锁的线程会处于休眠状态,并非忙等,是互斥锁

9.os_unfair_lock 的使用

os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
os_unfair_lock_trylock(&lock)
os_unfair_lock_lock(&lock)
os_unfair_lock_unlock(&lock)

10.pthread_mutex 的使用

pthread_mutexattr_t attr:
pthread_mutexattr_init(&attr);
//有正常锁  递归锁允许同一个线程重复加锁 
pthread_mutexattr_sttype(&attr,PTHREAD_MUTEX_NORMAL);
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,&attr);

pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex)

pyhread_mutexattr_destory(&attr)
pthread_mutex_destory(&mutex)

11.pthread_mutex 的条件,应用场景为线程 2 依赖于线程 1 的条件

12.NSLock是对 mutex的封装 , NSRecursiveLockNSCondition 同理

13.NSConditionLock 是对 NSCondition 的进一步封装,可以设置具体的条件值,控制子线程一个一个执行

14.semaphore 叫做信号量,信号量的初始值,可以用来控制线程并发的最大数量 15.iOS线程同步方案性能比较

16.自旋锁,互斥锁比较

17.atomic用于保证属性 settergetter 的原子性操作,相当于在 gettersetter 内部加了线程同步的锁,它并不能保证使用属性的过程是线程安全的

问题:atomic一定是线程安全的嘛?

回答:不是,setter,getter是线程安全的的,但它并不能保证使用属性的过程是线程安全的

18.iOS 中的读写安全方案 19.pthread_rwlock的使用 20.dispatch_barrier_async这个函数传入的并发队列必须是自己通过 creat 创建的并发队列,如果传入的是一个串行或者是一个全局的并发队列,那这个函数等同于 dispatch_async 函数的效果