semaphore学习笔记

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

你可能感兴趣的:(semaphore学习笔记)