据我所知,并发队列同时运行操作,这就是为什么它们与屏障一起用于解决读写问题的原因。但是,我无法理解是否同步地从主队列调用并发队列。它在执行读取操作时阻塞主队列。因此,在这种情况下,并发队列表现为串行队列。
例如:
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)
}
}如果使用串行队列,这将产生相同的结果。
由于这种结果,使用串行队列或并发队列来解决读写问题使我感到困惑。
所以我的问题是,为什么建议使用串行队列上的并发队列来解决读写问题?
这个问题与使用串行队列或并发队列读取存储的属性的用例有关。
发布于 2021-09-25 14:39:10
let queue = DispatchQueue(label: "queue_label", attributes: .concurrent) // concurrent queue如果此队列有多个项排队,则可以使用多个线程并行运行它们。它并不保证它会,但它可能会。而且,只有在同时排队的多个项目时,它才会这样做。
for i in 1..<11 {
queue.sync { ... }
}此循环对单个项进行排队,阻塞,直到项目被调度和完成,然后将另一项排队。如果这是所有的代码,那么队列中没有多个项。当然,如果有其他代码并行运行,则在queue上对项进行队列,那么可能会有并行项在运行。
正如所写的,这段代码是合法的,但似乎是无用的。如果printNumber很费时,而且这是在主队列上,它可能会使应用程序崩溃(或者至少在Mac上使用海滩球)。
你在这里所做的一切都不是“读写”问题,所以我不认为这是相关的。队列可以用来做各种事情。在这个特殊的例子中,似乎根本没有任何使用队列的理由,所以我将删除该代码。如果你有不同的问题,你可以问一个问题。
https://stackoverflow.com/questions/69280461
复制相似问题