如何在iOS上实现协同程序

我将一个C ++项目移植到iOS上以用于iPhone和iPad。 该项目广泛使用Bo​​ost.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分支提交应用程序。 我相信苹果的动机是确保它可以在未来某个时候转换到没有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];
        }
    }
    

    boost.coroutine(来自Oliver Kowalke;上个月来自boost社区)使用boost.context,它支持ARMv6(ARM Cortext Ax)

    链接地址: http://www.djcxy.com/p/53187.html

    上一篇: How to implement Coroutines on iOS

    下一篇: Throughput differences when using coroutines vs threading