在Grand Central Dispatch中使用串行队列的dispatch_async与dispatch_sync

好的,我喜欢Grand Central Dispatch,使用之后相对成功,但这是我不完全了解的。

假设我已经创build了我自己的串行队列

dispatch_queue_t myQueue; myQueue = dispatch_queue_create("myQueue", NULL); 

之后,我这样做:

 dispatch_async(myQueue, ^{ [self doStuff1]; }); // and a few lines later... dispatch_sync(myQueue, ^{ [self doStuff2]; }); 

第一次调度是asynchronous的。 所以,这将同时完成,对吧? 那么如果myQueue是连续的呢? 一个串行队列如何并行地执行或者如果你会不按顺序执行?

谢谢

dispatch_async()意味着块被排队, dispatch_async()返回在块被执行之前排队另一个任务/块(可能)。

使用dispatch_sync() ,块将被排队,并且该函数将不会继续排队另一个任务/块,直到该块被执行。

这些块仍然是连续执行的。 你可以执行100次dispatch_async()调用,每次调用一个可以hibernate100秒的块,而且速度非常快。 然后在相同的串行队列上调用dispatch_sync()dispatch_sync()将在〜10,000秒之后返回。


简单来说:

 dispatch_async(serialQ, block1); dispatch_async(serialQ, block2); dispatch_sync(serialQ, block3); 

block1将在block2之前执行, block2将在block3之前执行。 这是串行队列保证的顺序。

但是,调用dispatch_async()可能会任何块开始执行之前返回。 dispatch_sync()在所有三个块被执行之前不会返回!

dispatch_asyncdispatch_sync都不会改变块排队的方式。 如果队列是串行的,则这些块将以串行方式执行,如果队列并发,则以并行方式执行。

两者之间的重要区别在于dispatch_sync将该块排队,并在当前执行线程上等待,直到该块被执行,并且dispatch_async将该块排队并继续执行后续指令。