5

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

4

2 回答 2

33

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

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

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

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

于 2012-03-22T13:13:36.123 回答
0

苹果文档说

dispatch_get_global_queue

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

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

参数

priority 正在检索的队列的优先级。有关可能值的列表,请参阅“dispatch_queue_priority_t”。flags 此值保留供将来使用。您应该始终传递 0。 返回值 返回请求的全局队列。

讨论

众所周知的全局并发队列无法修改。与此函数返回的队列一起使用时,对 dispatch_suspend、dispatch_resume、dispatch_set_context 等的调用无效。

提交给这些全局并发队列的块可以相对于彼此同时执行。

可用性 适用于 iOS 4.0 及更高版本。在 dispatch/queue.h 中声明

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

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

于 2012-03-22T12:53:09.293 回答