首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串行与并发阻塞主队列的类似方式

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

Stack Overflow用户
提问于 2021-09-22 08:09:05
回答 1查看 149关注 0票数 0

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

例如:

代码语言:javascript
复制
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)
    }
}

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

由于这种结果,使用串行队列或并发队列来解决读写问题使我感到困惑。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-25 14:39:10

代码语言:javascript
复制
let queue = DispatchQueue(label: "queue_label", attributes: .concurrent) // concurrent queue

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

代码语言:javascript
复制
for i in 1..<11 {
    queue.sync { ... }
}

此循环对单个项进行排队,阻塞,直到项目被调度和完成,然后将另一项排队。如果这是所有的代码,那么队列中没有多个项。当然,如果有其他代码并行运行,则在queue上对项进行队列,那么可能会有并行项在运行。

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

你在这里所做的一切都不是“读写”问题,所以我不认为这是相关的。队列可以用来做各种事情。在这个特殊的例子中,似乎根本没有任何使用队列的理由,所以我将删除该代码。如果你有不同的问题,你可以问一个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69280461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档