ios中常見的多線程方案:
多線程容易混淆的術(shù)語:
多線程各種隊列的執(zhí)行效果:
Syn 往當前的串行隊列中添加任務(wù)就會產(chǎn)生死鎖,會卡住當前的串行對列。
所以我們需要線程加鎖(又叫線程同步)的方案解恰,IOS中線程加鎖的方式有以下幾種:
OSSpinlock又叫自旋鎖钾唬,等待鎖的線程會處于盲等(busy-wait)狀態(tài)项郊,一直占用著cpu的資源,目前已經(jīng)不再安全盈蛮,可能出現(xiàn)優(yōu)先級反轉(zhuǎn)問題,如果等待鎖的線程優(yōu)先級比較高技矮,它會一直占用cpu的資源抖誉,優(yōu)先級低的線程就無法釋放鎖。使用方法:
pthread_mutex又叫互斥鎖衰倦,等待鎖的線程會處于休眠狀態(tài)袒炉,使用方法:
pthread_mutex - 條件鎖
NSLock是對mutex普通鎖的封裝,NSRecursiveLock是對mutex遞歸鎖的封裝樊零,兩個鎖的使用方法:
NSCondition是對mutex和cond的封裝我磁,使用方法
NSConditionLock是對NSCondition的進一步封裝,可以設(shè)置具體的條件值驻襟,使用方法
dispatch_semaphore又叫信號量夺艰,信號量的初始值,可以用來控制線程并發(fā)訪問的最大數(shù)量沉衣,信號量的初始值為1郁副,代表同時只允許一條線程訪問資源,保證線程同步厢蒜。使用方法:
@synchronized是對mutex遞歸鎖的封裝霞势,源碼查看objc4中的objc—sync.mm文件,@synchronized(obj)內(nèi)部會生成obj對應(yīng)的遞歸鎖斑鸦,然后進行加鎖解鎖操作愕贡,使用方法:
ios線程同步方案性能比較
自旋鎖,互斥鎖比較:
pthread_rwlock又叫讀寫鎖巷屿,等待鎖的線程會進入休眠固以,使用方法:
注釋:遞歸鎖只是對同一個線程可以重復(fù)加鎖。