美文网首页iOSiOS 关键知识点
Swift DispatchSemaphore信号量

Swift DispatchSemaphore信号量

作者: Mr大喵喵 | 来源:发表于2019-03-18 17:22 被阅读0次
    • 定义
      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

    相关文章

      网友评论

        本文标题:Swift DispatchSemaphore信号量

        本文链接:https://www.haomeiwen.com/subject/rsebmqtx.html