1、用法一,控制資源訪問的線程數量
信號量, 控制資源同步訪問,同一時刻允許指定個數的線程訪問。
value為1,只允許1個線程訪問
value為2,同時允許2個線程訪問
value為0,無法訪問
value為負值,編譯器報錯
let t5 = DispatchSemaphore(value: 1)
func do1(_ str:String) {
t5.wait()
debug(str)
sleep(5)
t5.signal()
}
DispatchQueue.global().async {
for i in 1...100 {
do1("thread 1 \(i)")
}
}
DispatchQueue.global().async {
for i in 1...100 {
do1("thread 2 \(i)")
}
}
DispatchQueue.global().async {
for i in 1...100 {
do1("thread 3 \(i)")
}
}
DispatchQueue.global().async {
for i in 1...100 {
do1("thread 4 \(i)")
}
}
2、用法二, 異步變同步
初始化一個value為0的信號量
線程1等待, 線程2通知,signal()可以喚起wait()
let t6 = DispatchSemaphore(value: 0)
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now()+5) {
debug("我通知了")
t6.signal()
}
debug("正在等")
t6.wait()
debug("等到了")
同一個線程調用wait,和signal 會造成死鎖
let t6 = DispatchSemaphore(value: 0)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+5) {
debug("我通知了")
t6.signal()
}
debug("正在等")
t6.wait()
debug("等到了")