串行队列上的dispatch_async和dispatch_sync之间的区别?

JRG开发人员

我创建了一个这样的串行队列:

    dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);

什么之间的差异dispatch_async被称为像这样

 dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
 dispatch_async(_serialQueue, ^{ /* TASK 2 */ });

dispatch_sync在此串行队列中这样调用?

 dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
 dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });

我的理解是,无论使用哪种调度方法,TASK 1都将在执行之前完成并TASK 2正确吗?

陈柏霖

是。使用串行队列可确保任务的串行执行。唯一的区别是,dispatch_sync仅在块完成后dispatch_async返回,将其添加到队列后可能未完成才返回。

对于此代码

dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");

它可以打印2413214312341总是前3

对于此代码

dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");

它总是打印 1234


注意:对于第一个代码,它将不会打印1324因为执行后被printf("3")调度任务只有在分派才能执行 printf("2")


任务的执行时间不变。此代码始终打印12

dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });

可能发生的是

  • 线程1:dispatch_async将一个耗时的任务(任务1)同步到串行队列
  • 线程2:开始执行任务1
  • 线程1:将另一个任务(任务2)分配给串行队列
  • 线程2:任务1已完成。开始执行任务2
  • 线程2:任务2已完成。

你总是看到 12

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

任何人都可以向我解释dispatch_sync和dispatch_async之间的区别吗?

performSelectorOnMainThread:和主队列上的dispatch_async()有什么区别?

提取数据中的dispatch_async与dispatch_sync。迅速

使用dispatch_sync和dispatch_async同步对嵌套异步函数的调用

了解dispatch_sync和全局队列

GCD中的Dispatch_barrier_async和串行队列,它们之间有什么区别?

在Swift 3,Swift 4及更高版本中,我如何使用dispatch_sync,dispatch_async,dispatch_after等?

为什么不能在dispatch_async串行队列中停止计时器?

没有在模态运行循环中执行主队列上的dispatch_async块

主线程在viewDidLoad中的并发队列上或方法内执行dispatch_async很重要

dispatch_sync不适用于主队列

iOS中的dispatch_async和block

使用嵌套dispatch_sync / dispath_async处理死锁

在全局队列上用dispatch_async运行的块是否有可能在主线程上执行?

为什么我们需要在另一个队列上使用dispatch_sync()而不是在iOS GCD中使用当前队列/线程

iOS Core Data dispatch_async后台队列崩溃

如果我有一个dispatch_sync调用,然后在dispatch_async块中有第二个调度调用,那么第二个调用是sync还是async无关紧要?

在 dispatch_async 队列中的弱自我(dispatch_get_main_queue(),^{})

使用Objective-C中的大型中央dispatch / dispatch_async返回后台队列

如何使dispatch_async运行

如何使用dispatch_async

NgXS。store.dispatch()和context.dispatch()之间的区别?

是GCD dispatch_barrier还是dispatch_sync?

DISPATCH_QUEUE_CONCURRENT和全局并发调度队列之间有什么区别

了解ios UIView动画块和dispatch_async(dispatch_get_main_queue)块

iOS GCD:全局队列和具有后台优先级(DISPATCH_QUEUE_PRIORITY_BACKGROUND)的全局队列之间的区别?

来自函数的Swift dispatch_async

在dispatch_async中调用委托方法

main_queue上的dispatch_async?