类似方式的串行与并发阻塞主队列

Serial vs concurrent blocking main queue in similar fashion

据我了解,并发队列并发运行操作,这就是为什么它们与屏障一起使用来解决读写问题。但是,我无法理解是否从主队列同步调用并发队列。它会在执行读取操作时阻塞主队列。因此,在这种情况下,并发队列表现为串行队列。

例如:

let queue = DispatchQueue(label: "queue_label", attributes: .concurrent) // concurrent queue
        
for i in 1..<11 {
    queue.sync {
        
        printNumber(from: i*10, to: (i*10) + 9)
    }
}

如果改用串行队列,这会产生相同的结果。

因为这个结果,让我对使用串行队列还是并发队列来解决读写问题感到困惑。

所以我的问题是,为什么建议使用并发队列而不是串行队列来解决读写问题?

问题与使用串行队列或并发队列读取存储的属性用例有关。

let queue = DispatchQueue(label: "queue_label", attributes: .concurrent) // concurrent queue

如果此队列有多个项目排队,那么它可以使用多个线程来运行它们并行。它不承诺它会,但它可能会。而且只有在同时有多个项目排队时才会这样做。

for i in 1..<11 {
    queue.sync { ... }
}

此循环将单个项目排入队列,阻塞直到该项目被安排和完成,然后将另一个项目排入队列。如果这就是全部代码,那么队列中决不会有多个项目。当然,如果有其他代码 运行ning 并行,将项目排入 queue,那么可能有并行项目 运行ning.

正如所写,这段代码是合法的,但似乎毫无用处。如果 printNumber 很耗时,并且它在主队列中,它可能会使应用程序崩溃(或者至少在 Mac 上使它崩溃)。

您在这里所做的一切都不是“读写”问题,所以我认为这不相关。队列可以用来做各种各样的事情。在此特定示例中,似乎根本没有任何理由使用队列,因此我将删除该代码。如果您有其他问题,可以打开一个问题来询问。