ios – NSCD()上是否有GCD dispatch_async等待?

ios – NSCD()上是否有GCD dispatch_async等待?,第1张

概述从我读到的关于Grand Central Dispatch的内容来看,GCD不会进行抢占式多任务处理;它只是一个单一的事件循环.我无法理解这个输出.我有两个队列只是做一些输出(起初我正在读/写一些共享状态,但我能够简化到这个并仍然得到相同的结果). dispatch_queue_t authQueue = dispatch_queue_create("authQueue", DISPATCH_QU 从我读到的关于Grand Central dispatch的内容来看,GCD不会进行抢占式多任务处理;它只是一个单一的事件循环.我无法理解这个输出.我有两个队列只是做一些输出(起初我正在读/写一些共享状态,但我能够简化到这个并仍然得到相同的结果).

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等待?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1007538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存