信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
信号量可以分为几类:
下述代码中,线程A将等线程B调用之后再逐一运行。如果换成NSLock理论上由其他线程是不允许的,但运行结果一切正常。而换成NSRecursiveLock递归锁,所有加锁操作将失效,线程不会挂起。用pthread_mutex,也是在设置属性为可递归时,加锁才会失效。(普通互斥锁可能是由信号量实现的,具体原因不明,但不建议这样使用。)
let semt = DispatchSemaphore(value: 1)
let q1 = DispatchQueue(label:"A")
let q2 = DispatchQueue(label:"B")
for i in 0...20 {
q1.async {
print(" \(i)")
semt.wait()
print("waite \(i)")
}
q2.asyncAfter(deadline: .now() + .seconds(i * 1)){
semt.signal()
print("post \(i) ")
}
}
抽象的来讲,信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。只要我们能够抓住信号量的本质,理解起来也就简单许多了。类似的不常见的多线程术语,在动力节点在线的视频课程中都有专门的讲解,让我们打好Java基础的同时,拓展自己的知识面,开拓自己的视野。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54