1. DispatchSemaphore
場景:
- 控制異步操作的最大并發(fā), 如多圖下載控制并發(fā), 用戶中途取消可以節(jié)約流量.
- 異步操作同步執(zhí)行, 如數(shù)據(jù)庫異步讀寫, 防止多線程同時操作同一文件.
semaphore: 臂板信號系統(tǒng), 簡稱dispatch信號量
核心: 信號量小于0則等待, 否則執(zhí)行
創(chuàng)建一個semaphore, 并設(shè)置初試信號數(shù)
public init(value: Int)
發(fā)送一個信號, 信號數(shù)+1, 線程等待返回0, 否則非0
public func signal() -> Int
等待信號, 信號數(shù)-1, 若信號數(shù)小于0則等待, 直至信號數(shù)不小于0
public func wait()
可以設(shè)置等待過期時間, DispatchTime為主板時間CPU時鐘計時, DispatchWallTime為實際時間即系統(tǒng)時間, 返回值為成功或超時
public func wait(timeout: DispatchTime) -> DispatchTimeoutResult
public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult
tip:
線程數(shù)大于核數(shù)兩倍的時候會比較耗性能
2. Dipatch_barrier
場景:
我們有一個并發(fā)的隊列用來讀寫數(shù)據(jù)庫。讀取操作必須等待多個寫入操作完成后才能讀取,否則就可能會出現(xiàn)讀到的數(shù)據(jù)不對方灾。
Tip:
Dipatch_barrier
現(xiàn)在屬性放在了DispatchWorkItemFlags
里
let q = DispatchQueue.init(label: "data")
q.async {
//write action
}
q.async {
//write action
}
q.async(flags: DispatchWorkItemFlags.barrier){
//read action
}
barrier_async
與 barrier_sync
的異同
-
共同點:
- 都會等待在它前面插入隊列的任務(wù)(1、2甘磨、3)先執(zhí)行完
- 都會等待他們自己的任務(wù)(0)執(zhí)行完再執(zhí)行后面的任務(wù)(4廓鞠、5、6)
不共同點:
在將任務(wù)插入到queue
的時候浇借,barrier_sync
需要等待自己的任務(wù)(0)結(jié)束之后才會繼續(xù)程序事秀,然后插入被寫在它后面的任務(wù)(4彤断、5、6)易迹,然后執(zhí)行后面的任務(wù) 而barrier_async
將自己的任務(wù)(0)插入到queue
之后宰衙,不會等待自己的任務(wù)結(jié)束,它會繼續(xù)把后面的任務(wù)(4睹欲、5供炼、6)插入到queue
所以,barrier_async
的不等待(異步)特性體現(xiàn)在將任務(wù)插入隊列的過程句伶,它的等待特性體現(xiàn)在任務(wù)真正執(zhí)行的過程劲蜻。