信號量
經(jīng)測試swift3
測試版本xcode 8.3.2 iOS 10.1.1 iPhone6p
還是存在這個弱點(diǎn)
let lock = DispatchSemaphore(value: 1)//信號量創(chuàng)建套蒂,1表示最多可以進(jìn)入的線程數(shù)蛤袒,當(dāng)參數(shù)為1的時候可以當(dāng)同步鎖使用
lock.wait()//上鎖
//dosometing
lock.signal()//開鎖
###自旋鎖
>```
var lock = OS_SPINLOCK_INIT //創(chuàng)建參數(shù)
OSSpinLockLock(&lock) //上鎖
//dosomething
OSSpinLockUnlock(&lock)//開鎖
場景設(shè)置:三個高中低的并發(fā)線程,優(yōu)先級高的線程搶占CPU的能力總是高于優(yōu)先級低的線程(不是說低優(yōu)先級的線程就不能運(yùn)行了闷板,這個就不說了,自己揣摩)损姜。
如果上面的場景成立了,那么低優(yōu)先級的線程就會持有鎖疆栏,但是不能搶占cpu資源贬媒,從而導(dǎo)致任務(wù)遲遲不能完成,無法釋放鎖绷旗,造成cpu(大量占用cpu)堵塞做許多無用功喜鼓。。刁标。貌似如此一說颠通,同步鎖都會有這臭毛病了,但是呢膀懈,顿锰,實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)
創(chuàng)建三個并發(fā)隊(duì)列:
let bq1 = DispatchQueue(label: "1", qos: DispatchQoS.utility, attributes: DispatchQueue.Attributes.concurrent)
let bq2 = DispatchQueue(label: "2", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent)
let bq3 = DispatchQueue(label: "3", qos: DispatchQoS.userInteractive, attributes: DispatchQueue.Attributes.concurrent)
//優(yōu)先級關(guān)系bq3>bq2>bq1
先測試自旋鎖
var lock = OS_SPINLOCK_INIT
bq1.async {
OSSpinLockLock(&lock)
for i in 0 ..< 1000 {
sleep(1)
print("低級\(i)")
}
OSSpinLockUnlock(&lock)
}
sleep(1)
bq2.async {
OSSpinLockLock(&lock)
for i in 0 ..< 1000 {
sleep(1)
print("中級\(i)")
}
OSSpinLockUnlock(&lock)
}
sleep(1)
bq3.async {
OSSpinLockLock(&lock)
for i in 0 ..< 1000 {
sleep(1)
print("高級\(i)")
}
OSSpinLockUnlock(&lock)
}
結(jié)果:
查看cup占有@2x.png
再來看看我們的主角信號量
let lock = DispatchSemaphore(value: 1)
bq1.async {
lock.wait()
for i in 0 ..< 1000 {
sleep(1)
print("低級\(i)")
}
lock.signal()
}
sleep(1)
bq2.async {
lock.wait()
for i in 0 ..< 1000 {
sleep(1)
print("中級\(i)")
}
lock.signal()
}
sleep(1)
bq3.async {
lock.wait()
for i in 0 ..< 1000 {
sleep(1)
print("高級\(i)")
}
lock.signal()
}
Q19@2x.png