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

标签 ios swift multithreading grand-central-dispatch concurrent-queue

我被要求在 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. 为什么设置总是报错? enter image description here
  4. 与串行队列相比,并发队列在这种情况下(对于 get 和 set)有何优势?
  5. 在 iOS 中,什么时候应该选择串行队列而不是并发队列?反之亦然?

最佳答案

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

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

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

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

4、引用答案1

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

关于ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71850309/

相关文章:

ios - 如何使用 NSCoding 保存 Int64 变量

ios - 如何获取当前正在输入的单词?

Android:无法关闭进度对话框

c# - 多线程后台 worker 设计

ios - 在 ParentViewController 中检测 ChildViewController 的 Pop

ios - 表格 View 单元格上的标签被切断

ios - 应用程序被电话 iOS 打断后音频无法播放

iOS侧滚动图画小说

ios - void 函数中出现意外的非 void 返回值 - Swift 4(Firebase、Firestore)

java - Thread.sleep() 阻塞主 UI 线程