GCD 实例用法

2018-12-03  本文已影响0人  zh_19

读写锁

读写锁的特点:

  1. 可以多方同时读
  2. 写是互斥的
  3. 新读取的东西必须是写后的

我们可以利用queue中barrier的特性


image.png

图片来源 grand-central-dispatch-tutorial-for-swift-4-part-1-2

由上图所示 当concurrent队列里有BarrierTask时,此时队列就像serial队列一样,只有当BarrierTask执行结束后,队列才会恢复正常

代码如下

class RWLock {
    private var concurrentQueue: DispatchQueue
    
    init(qos: DispatchQoS = .default) {
        concurrentQueue = DispatchQueue(label: "com.RWLock.label", qos: qos, attributes: .concurrent)
    }
    
    func read<T>(execute work: @escaping () -> T) -> T {
        var t: T!
        concurrentQueue.sync {
            t = work()
        }
        return t
    }
    
    func write(execute work: @escaping () -> Void) {
        concurrentQueue.async(flags: .barrier) {
            work()
        }
    }
}

Concurrency Looping

并发执行这个loop, 是同步调用并且所有工作都完成才会返回。

DispatchWorkItem

上一篇 下一篇

猜你喜欢

热点阅读