【问题标题】:Is dispatch_sync(dispatch_get_global_queue(xxx), task) sync or asyncdispatch_sync(dispatch_get_global_queue(xxx), task) 是同步还是异步
【发布时间】:2012-04-07 00:37:00
【问题描述】:

正如苹果文档所说,dispatch_get_global_queue()是并发队列,dispatch_sync是串行的意思。那么任务是异步处理还是同步处理?

【问题讨论】:

    标签: ios concurrency queue dispatch


    【解决方案1】:

    您对什么是队列以及异步与同步的含义感到困惑。

    队列是可以在其上运行块的实体。这些可以是串行的或并发的。串行意味着如果你按照 A、B、C、D 的顺序放置块,那么它们将被执行 A,然后是 B,然后是 C,然后是 D。并发意味着这些相同的块可能会以不同的顺序执行,并且可能甚至不止一个(假设你有多个内核可以运行,显然)。

    然后进入异步与同步。异步意味着当你调用dispatch_async 时,它会立即返回,并且块会在队列中排队。同步意味着当你调用dispatch_sync时,它只会在块执行完毕后返回。

    因此,要完全回答您的问题,如果您将dispatch_sync 加入全局并发队列,则该块将运行,可能与该队列上的其他块并行运行,但以同步方式 - 即它不会返回,直到块完成了。

    【讨论】:

    • 谢谢你:-)。虽然其中肯定有更多解释的空间,但这是一个开始,我会回答@keywind 的任何问题。
    • 非常感谢您的回答
    • 这里要知道的另一件事是同步/异步调度在概念上与串行/并发队列正交。只有入队线程关心同步/异步(因为这决定了入队线程上的执行是立即恢复,还是在块执行后恢复)。入队的块本身完全不知道它是同步提交还是异步提交。
    【解决方案2】:

    苹果文档说

    dispatch_get_global_queue

    返回给定优先级的众所周知的全局并发队列 级别。

    dispatch_queue_t dispatch_get_global_queue( 长期优先, 无符号长标志);

    参数

    priority 正在检索的队列的优先级。为一个 可能值列表,请参阅“dispatch_queue_priority_t”。标记这个 值保留以供将来使用。你应该总是传递 0。返回 Value 返回请求的全局队列。

    讨论

    众所周知的全局并发队列无法修改。 调用 dispatch_suspend、dispatch_resume、dispatch_set_context 和 与 this 返回的队列一起使用时,like 无效 功能。

    提交到这些全局并发队列的块可能会被执行 同时相对于彼此。

    可用性 适用于 iOS 4.0 及更高版本。宣布于 dispatch/queue.h

    在讨论中他们说->“提交的块可以同时执行。”

    因此任务可以彼此异步处理。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多