ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列

我被要求在 swift 中实现一个线程安全的字典,我使用了常见的方法:

 class MutableDictionary {
    var dictionary: [String : Any] = [:]
    var queue = DispatchQueue(label: "queue", attributes: .concurrent)
    
    func object(for key:  String) -> Any? {
        queue.sync {
            return dictionary[key]   
        }
    }
    
    func set(_ object: Any?, for key: String) {
        queue.async(flags: .barrier) {
            self.dictionary[key] = object
        }
    }
}

但是,接下来的问题是:

  1. 在这种情况下使用 concurrent + barrier 与仅使用 serialQueue 进行设置有什么区别?
  2. 我在 playground 上做了一个测试,我用 1000 次 for 循环包装了 get 和 set,事实证明串行和并发队列的行为几乎相同。
  3. 为什么设置总是报错?
  4. 与串行队列相比,并发队列在这种情况下(对于 get 和 set)有何优势?
  5. 在 iOS 中,什么时候应该选择串行队列而不是并发队列?反之亦然?

最佳答案

1、使用barrier,并发队列暂时可以一次执行一个任务。

但是,serialQueue 一次只能执行一项任务。

2、假设你只用队列来读/写,显然它们的效果是一样的。如果你将另一种任务交给它,显然并发队列的成本更低,这才是真正的区别。

3、提交给async对象的地址会在你的对象是类的时候定义。当你给类成员一个新值时,你将有一个错误的地址,所以你无法访问它并且错误来了。 您可以通过结构尝试 .

4、引用答案1

5、有时候希望任务执行得更快,concurrentQueue优先。如果你想有序地执行任务,serialQueue 做的更好。

https://stackoverflow.com/questions/71850309/

相关文章:

javascript - Vue 3 - "Failed to resolve component"

r - 将嵌套列表中的名称分配给它的子组件

haskell - 为什么类型为 [tail, init, reverse], [[a] -> [a

javascript - 解决对多个参数值的 promise

javascript - Nuxt中如何使用动态图片?

c# - 无法启动程序,访问被拒绝 C# net6.0

python - 正确完成所有操作后出现 Ngrok 错误 6022

kubernetes - kubectl 等到 pod 消失(终止)

typescript - 类型错误 : Cannot find module 'firebase-f

go - 用类型参数替换接口(interface)参数有什么好处?