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("等到了")