ios - GCD 中的并发队列与串行队列

标签 ios multithreading concurrency grand-central-dispatch

我正在努力完全理解 GCD 中的并发和串行队列。我有一些问题,希望有人能清楚、中肯地回答我。

  1. 我读到串行队列的创建和使用是为了一个接一个地执行任务。但是,如果发生以下情况会怎样:

    • 我创建一个串行队列
    • 我使用 dispatch_async(在我刚刚创建的串行队列上)三次来分派(dispatch)三个 block A、B、C

    三个block会不会被执行:

    • 顺序是A,B,C,因为队列是串行的

    • 并发(同时在并行线程上)因为我使用了 ASYNC 分派(dispatch)
  2. 我读到我可以在并发队列上使用 dispatch_sync 以便一个接一个地执行 block 。在那种情况下,为什么串行队列甚至存在,因为我总是可以使用并发队列,在那里我可以根据需要同步分派(dispatch)尽可能多的 block ?

    感谢任何好的解释!

最佳答案

一个简单的例子:你有一个 block 需要一分钟来执行。您将它从主线程添加到队列中。让我们来看看这四种情况。

  • 异步 - 并发:代码在后台线程上运行。控制立即返回到主线程(和 UI)。该 block 不能假定它是该队列上运行的唯一 block
  • 异步 - 串行:代码在后台线程上运行。控制立即返回到主线程。该 block 可以假定它是该队列上运行的唯一 block
  • sync - 并发:代码在后台线程上运行,但主线程等待它完成,阻止对 UI 的任何更新。该 block 不能假定它是该队列上运行的唯一 block (我可以在几秒钟前使用异步添加另一个 block )
  • 同步 - 串行:代码在后台线程上运行,但主线程等待它完成,阻止对 UI 的任何更新。该 block 可以假定它是该队列上运行的唯一 block

显然,对于长时间运行的进程,您不会使用最后两个中的任何一个。当您尝试从可能在另一个线程上运行的内容更新 UI(总是在主线程上)时,您通常会看到它。

关于ios - GCD 中的并发队列与串行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19179358/

相关文章:

ios - 时间戳不会改变字符串格式

ios - "apple-mobile-web-app-capable"注销后站点切换到 Mobile Safari

ios - UNUserNotificationCenter Swift - 在特定情况下不触发本地通知

java - Java中捕获异常的并发排序任务执行器

C++复制结构的内容

c# - SyncRoot 模式有什么用?

iphone - iOS NSXML 解析未格式化的 HTML

c# - wait方法不占用资源

java - 使用 Executors.defaultThreadFactory().newThread 的原因是什么?

haskell - Haskell TVar 的容器