Swift DispatchSemaphore信号量
2019-03-18 本文已影响0人
Mr大喵喵
- 定义
1、信号量:就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。
其实,这有点类似锁机制了,只不过信号量都是系统帮助我们处理了,我们只需要在执行线程之前,设定一个信号量值,并且在使用时,加上信号量处理方法就行了。 - 信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。 一般情况是这样进行临界访问或互斥访问的: 例如设置信号量初始值为1, 当一个进程A运行时候,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这时候信号量值为0。系统中规定当信号量值为0是,必须等待,直到信号量值不为0时才能继续操作。 这时如果进程B想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就到到了进程A排他访问。 当进程A运行结束后,释放资源,进行V操作。资源数重新加1,时候信号量的值变为1. 这时进程B发现资源数不为0,信号量能进行P操作了,立即执行P操作。 这就是信号量来控制互斥的原理。
实际应用
在开发中我们需要等待某个网络回调完之后才执行后面的操作,根据啥给你们分析的过程,可以写出如下代码,达到这种效果。
let semaphore = DispatchSemaphore(value: 1) 初始化信号量为1
semaphore.wait() 信号量 -1
semaphore.signal() 信号量为+1
// 创建一个并发队列
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
//初始化信号量为1
let semaphore = DispatchSemaphore(value: 1)
// 异步操作加入第一个网络请求
concurrentQueue.async() {
semaphore.wait()
self.boVM.requsetBoutique_list(1, {
sleep(3)
print("1-----------1")
semaphore.signal()
})
}
// 异步操作加入第二个网络请求
concurrentQueue.async() {
semaphore.wait()
self.boVM.requsetBoutique_list(1, {
print("2")
semaphore.signal()
})
}
// 异步操作加入第三个网络请求
concurrentQueue.async() {
semaphore.wait()
self.chVM.requestChildList(.Subscription, {
print("3")
semaphore.signal()
})
}
-
输出的打印
WechatIMG43.jpeg