gpt4 book ai didi

ios - 硬件在 SAME 线程异步调用中会发生什么?

转载 作者:行者123 更新时间:2023-11-29 02:43:30 26 4
gpt4 key购买 nike

注意,相关但不相同:iPhone - Grand Central Dispatch main thread

我在这个问题上失败了很多次,所以这是源代码:

在主线程上

dispatch_async( dispatch_get_main_queue(), ^{ NSString * str = @"Interrupt myself to do something."} );

我只是好奇,当一个线程切换时,它会将其寄存器存储在线程本地存储中,切换上下文,从它在程序计数器中的新位置运行(我假设它在程序的副本中,它只使用一个不同的堆栈和寄存器),然后它“返回”到主线程。

当它自己中断时,我只是想知道什么决定它应该何时中断,以及 Thread Local 的东西会发生什么。

我已经阅读了一些内容,但我仍然在思考程序不是连续的这一事实。它们只是“当操作系统决定运行进程的一部分或其 block (线程)时,以小块的形式做的事情”。

我是自学成才的,这可能会增加我对寄存器/asm 知识的缺乏,而这对任何学者来说都是标准知识。

谢谢。该代码应该有所帮助,这是特定于 iOS 的,但我相信答案/问题与从 main-to-main 的任何语言有关。

由于过去的每一次尝试都会导致冗长的答案而忽略了我问这个问题的原因,所以我将最后一次重复......

这是针对同一线程的。主对主。它真的只是自己停下来,将程序计数器移到别处,然后在该 block 结束吗?此外,这些事情通常不会在分支机构发生变化(if/for 和 blocks 也是如此)。

给我指出正确的方向也行,但就像我说的,之前这个问题被误读了。

最佳答案

如果不了解 GCD 的内部结构,很难具体回答你的问题,但一般来说,答案是否定的,简单地将工作单元添加到调度队列中不会立即中断正在执行的代码。

正如您所建议的,上下文切换非常昂贵,不仅在状态保存和恢复方面,而且处理器需要转储指令管道,从而导致周期浪费。

通常操作系统会继续执行当前任务,直到挂起(例如等待网络或其他 IO 操作)或者可能被某些外部事件中断(按手机上的 home 键),但也有时间防止失控任务锁定整个设备的限制(这是抢占式多任务处理,而不是任务需要放弃 CPU 的协作多任务处理)

使用dispatch_async,无法保证代码何时相对于当前代码块执行。该代码块甚至可能不是队列中的下一个 - 其他线程可能在此之前已将其他工作单元添加到队列中。

关于ios - 硬件在 SAME 线程异步调用中会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25437631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com