读写锁
读写锁的特点:
- 可以多方同时读
- 写是互斥的
- 新读取的东西必须是写后的
我们可以利用queue中barrier的特性
image.png
由上图所示 当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, 是同步调用并且所有工作都完成才会返回。
网友评论