信号量的作用是处理同一时间的最大并发量
1.锁,信号量控制为1,那就是一个锁了
var money:Int = 100
var semaphore:DispatchSemaphore = DispatchSemaphore(value: 1)
func saveMoney()
{
var oldMoney: Int = self.money
sleep(UInt32(0.2)) //处理数据
oldMoney += 60
self.money = oldMoney
print("加60个币,还剩\(oldMoney)币 - \(Thread.current)")
}
func drawMoney()
{
var oldMoney: Int = self.money
sleep(UInt32(0.3)) //处理数据
oldMoney -= 10
self.money = oldMoney
print("减去10个币,还剩\(oldMoney)币 - \(Thread.current)")
}
override func viewDidLoad() {
DispatchQueue.global().async{
for _ in 0..<10 {
self.semaphore.wait() //信号量-1
self.saveMoney()
self.semaphore.signal() //信号量+1
}
}
DispatchQueue.global().async{
for _ in 0..<10 {
self.semaphore.wait()
self.drawMoney()
self.semaphore.signal()
}
}
}
比如这么写,确实就是一个锁的功能,同时我觉得它应该是效率最高的锁,因为它甚至不用创建一堆锁对象,去写复杂的底层锁代码
2.控制最大并发量
这个才是它真正的作用,也不赘述了,使用和上面一样,wait和signl一个-1,一个+1,信号量是0就得等待