ios中常见的多线程方案:

多线程容易混淆的术语:

多线程各种队列的执行效果:

Syn 往当前的串行队列中添加任务就会产生死锁,会卡住当前的串行对列。
所以我们需要线程加锁(又叫线程同步)的方案,IOS中线程加锁的方式有以下几种:

OSSpinlock又叫自旋锁,等待锁的线程会处于盲等(busy-wait)状态,一直占用着cpu的资源,目前已经不再安全,可能出现优先级反转问题,如果等待锁的线程优先级比较高,它会一直占用cpu的资源,优先级低的线程就无法释放锁。使用方法:

pthread_mutex又叫互斥锁,等待锁的线程会处于休眠状态,使用方法:

pthread_mutex - 条件锁

NSLock是对mutex普通锁的封装,NSRecursiveLock是对mutex递归锁的封装,两个锁的使用方法:

NSCondition是对mutex和cond的封装,使用方法

NSConditionLock是对NSCondition的进一步封装,可以设置具体的条件值,使用方法

dispatch_semaphore又叫信号量,信号量的初始值,可以用来控制线程并发访问的最大数量,信号量的初始值为1,代表同时只允许一条线程访问资源,保证线程同步。使用方法:

@synchronized是对mutex递归锁的封装,源码查看objc4中的objc—sync.mm文件,@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁解锁操作,使用方法:

ios线程同步方案性能比较

自旋锁,互斥锁比较:

pthread_rwlock又叫读写锁,等待锁的线程会进入休眠,使用方法:

注释:递归锁只是对同一个线程可以重复加锁。
网友评论