Swift DispatchSemaphore信号量

  • 定义
    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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。