dispatch_queue_t authQueue = dispatch_queue_create("authQueue",disPATCH_QUEUE_SERIAL);dispatch_queue_t authQueue2 = dispatch_queue_create("authQueue",disPATCH_QUEUE_SERIAL);dispatch_async(authQueue,^{ NSLog(@"First Block"); NSLog(@"First Block Incrementing"); NSLog(@"First Block Incremented"); });dispatch_async(authQueue,^{ NSLog(@"Second Block"); NSLog(@"Second Block Incrementing"); NSLog(@"Second Block Incremented"); });dispatch_async(authQueue2,^{ NSLog(@"Third Block"); NSLog(@"Third Block Incrementing"); NSLog(@"Third Block Incremented"); });
我得到以下输出:
2011-12-15 13:47:17.746 App[80376:5d03] Third Block2011-12-15 13:47:17.746 App[80376:1503] First Block2011-12-15 13:47:17.746 App[80376:5d03] Third Block Incrementing2011-12-15 13:47:17.746 App[80376:1503] First Block Incrementing2011-12-15 13:47:17.748 App[80376:1503] First Block Incremented2011-12-15 13:47:17.748 App[80376:5d03] Third Block Incremented2011-12-15 13:47:17.750 App[80376:1503] Second Block2011-12-15 13:47:17.750 App[80376:1503] Second Block Incrementing2011-12-15 13:47:17.751 App[80376:1503] Second Block Incremented
很明显,这些块不是原子地执行的.我唯一的理论是GCD通过NSLog写入stdio会使当前执行等待.我在Apple文档中找不到与此相关的任何内容.有谁能解释一下?
解决方法 GCD不使用任何类型的“事件循环”.它是最近发布的Mac OS X和iOS中的一个新内核功能,它实际上没有我所知道的任何其他类似技术.目标是在硬件允许的情况下尽快完成执行所有代码.请注意,它的目标是最快的完成时间,而不是最快的开始时间.一个微妙的差异,但一个重要的差异与现实世界影响它的工作方式.
如果你只有一个空闲的cpu核心,那么理论上一次只能执行其中一个核心.因为单个内核中的多任务比顺序执行两个任务要慢.但实际情况并非如此.如果cpu核心暂时变得空闲或者不是很忙(例如,读取硬盘驱动器,或等待其他程序响应(Xcode绘制NSLog输出)),那么它很可能会继续执行一秒钟GCD项目,因为它正在进行的项目被卡住了.
当然,大多数情况下,您将拥有多个空闲cpu核心.
它也不一定按照你给出的确切顺序执行. GCD /内核可以控制这些细节.
对于您的具体示例,Xcode的调试器可能一次只能处理一个NSLog()事件(至少,它必须一次绘制一个屏幕).你有两个队列,他们可能会同时开始执行.如果您一次发送两个NSLog()语句,其中一个将等待另一个完成.因为除了向Xcode打印东西之外你没有做任何事情,这两个GCD队列将成为第一个将日志数据发送到Xcode的竞赛.第一个有一个轻微的开端,但它是一个非常轻微的,并且通常不足以首先打开与Xcode的连接.
这完全取决于特定纳秒时间硬件上可用的实际硬件资源.你无法预测它,需要适当地构建你的队列以承担一些控制.
总结以上是内存溢出为你收集整理的ios – NSCD()上是否有GCD dispatch_async等待?全部内容,希望文章能够帮你解决ios – NSCD()上是否有GCD dispatch_async等待?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)