ios - 如何在 iOS 上实现协程

标签 ios arm coroutine

我正在将一个 C++ 项目移植到 iOS,以便在 iPhone 和 iPad 上使用。该项目广泛使用了 Boost.Coroutine 库。 Boost.Coroutine 没有针对 iPhone 的 ARMv6/ARMv7 指令集的实现。

  • 是否有其他可以在 iOS 上运行的协程库?

  • 如果不能,是否可以在 ARM 上编写协程行为?我可以看到一些可能的方法来做到这一点:

    • 直接编写汇编指令来执行堆栈操作。我不太精通汇编,我担心 ARM 架构可能不包含复制和粘贴堆栈或手动移动堆栈指针所需的指令。
    • 使用类似于 pthreads 或 Win32 纤程的东西编写协程。我不确定是否有类似的东西可以在 iOS 上使用。
    • 在线程之上实现协程,甚至可能是 Boost.Coroutine 本身。这似乎最有可能奏效,但肯定会有性能缺陷。

注意:Unity 在 iOS 上支持 C# 协程;我不确定这是否仅限于典型协程行为的一小部分。如果没有,这是否意味着 Unity 有解决方案?

最佳答案

您几乎肯定不想编写汇编指令来执行堆栈操作。 iOS 已经在其第三版 ARM 指令集上,从 ARMv6 过渡到 ARMv7 再到 ARMv7s。从 iPhone 5 开始,Apple 进一步添加了人为障碍,即您不能使用同样支持全 iPhone 5 屏幕的 ARMv6 分支提交应用程序。我确信 Apple 的动机是确保它可以在未来的某个时候过渡到没有 ARMv6 兼容模式的处理器,但对于我们开发人员来说,这显然意味着不要过于依赖特定的指令集。

剩下线程。 iOS 有一整套完善的线程机制,pthread 可以公开相关的子集。 Grand Central Dispatch 往往是现在使用的常规解决方案,以确保不同的任务可以同时发生,因此吞噬了大部分 Internet 文档,但较低级别的解决方案仍然存在。

明显的简单示例,使用 NSConditionLock :

- (void)methodOnThread1
{
    while(1)
    {
        [conditionLock lockWhenCondition:kMoreInputAvailable];

        // process whatever is currently in the common access pool

        [conditionLock unlockWithCondition:kWaitingForInput];
    }
}

- (void)methodOnThread2
{
    while(1)
    {
         // do whatever is necessary to produce more input,
         // creating it locally and taking as long as it takes


        [conditionLock lockWhenCondition:kWaitingForInput];

        // push input to common access pool, by whatever means

        [conditionLock unlockWithCondition:kMoreInputAvailable];
    }
}

关于ios - 如何在 iOS 上实现协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13300868/

相关文章:

asynchronous - Kotlin:将 "normal"函数转换为阻塞挂起函数对性能有何影响?

Python 在 Popen.stdout.readline 上设置超时

c# - 负责 MVVM 中的异步执行

ios - 如何在解析数据库 ios 中加载所有用户的用户名

ios - 如何在解析数据库中执行连接

ARM 引导加载程序 : Interrupt Vector Table Understanding

c++ - KEIL错误: no instance of overloaded function “std::transform” matches the argument list

ios - Github 操作 : xcpretty is not found despite being installed

ios - 操作未完成时如何隐藏(覆盖)所有按钮

linux - 如何在ubuntu上安装arm-linux-gcc-3.3.2.tar.bz2