信号量机制实质是PV操作,具体操作如下:
1、P操作的动作是:
(1)S减1;
(2)若S减1后大于或等于零,则程序继续执行;
(3)若S减1后小于零,则被阻塞后进入与相对应的等待队列。
2、V操作的动作是:
(1)S加1;
(2)若S加1后大于零,则程序继续执行;
(3)若S加1后小于或等于零,则从等待队列中唤醒一等待进程,然后再返回原程序继续执行。
PV操作须成对使用,举个例子 :
DispatchQueue.global().async {
/// 初始化值 S = 0
let semaphore = DispatchSemaphore(value: 0)
for _ in 0..<4 {
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 3)
DispatchQueue.main.async {
/// S = -1 + 1,S = 0, 唤醒对应的等待进程,并继续执行
semaphore.signal()
}
}
/// S = 0 - 1,S = -1, 进程阻塞并进入等待队列
semaphore.wait()
}
DispatchQueue.main.async {
print("全部执行完毕")
}
}
网友评论