【iOS】GCD 之 Semaphore 信号量

2018-07-12  本文已影响17人  emmet7life

参考资料:

  1. Medium : The Beauty of Semaphores in Swift
  2. Medium : A Quick Look At Semaphore
  3. 不羁阁:『GCD』详尽总结
Semaphore信号量主要用途有两个:
  1. 用于多线程对共享资源的访问控制,保证线程安全,为线程加锁。
  2. 保持线程同步,将异步任务转换为同步任务。

Tip : 共享资源可以是一个变量,一个从url下载图片的任务,读取数据库的任务等等。

一些理论知识(A Bit of Theory)

信号量是由一个线程队列和一个计数器(Int类型)组成的。

线程队列(Threads Queue) : 采用FIFO先进先出机制用来追踪等待线程(等待访问共享资源的线程)。

计数器(Counter Value) : 用来决定一个线程是否可以访问共享资源。(waitsignal方法都将改变计数器的值)

那么,我们什么时候调用waitsignal方法呢?

调用wait方法时,行为规则如下:

调用signal方法时,行为规则如下:

上面所述流程可用图示表示如下:


wait和signal执行规则图示

具体的例子可以查看上面文章中的例子(文章需要翻墙!!)

这里重点总结几点实际使用过程中的小Tip:

代码示例:

  1. 异步任务转同步任务

     var value = 10
     let semaphore = DispatchSemaphore(value: 0)
     var waitResult: DispatchTimeoutResult = .success
     DispatchQueue.global().async {
         value = 100
         Thread.sleep(forTimeInterval: 3.0)
         if waitResult == .success {
             semaphore.signal()
         }
     }
     // 试着将这里的超时时间参数改改查看效果
     waitResult = semaphore.wait(timeout: DispatchTime.distantFuture)
     switch waitResult {
     case .success:
         print("success")
     case .timedOut:
         print("timedOut")
     }
    
  2. 查看不羁阁:『GCD』详尽总结的文章末尾,这里讲到了信号量及其应用示例。

了解一些概念:
优先级反转问题及解决方法

上一篇下一篇

猜你喜欢

热点阅读