您的问题是关于实现上下文切换。正如我们在评论中相当详尽地介绍的那样,对上下文切换的支持是任何多任务系统的关键特征之一,尤其是多任务操作系统。既然您假定操作系统不支持上下文切换,那么您就是在谈论为单任务操作系统实现多任务处理。
您将操作系统描述为提供某种任务队列(“为了放弃控制,线程必须简单地退出其运行循环”)并没有改变这一点,尽管在某种程度上我们可以将其视为语义问题。我想这样一个系统的典型任务将通过创建和执行一系列微任务(“运行循环”的工作)来运行,为每个微任务提供一个共享的、可变的内存上下文。这样的运行循环可以安全地退出,然后再重新进入,从中断的地方继续生成微任务。
在肯定的应用程序操作(即您的)定义的边界上将任务划分为微任务pause()
将取决于 ISO C 提供的能力之外的能力。然而,很可能可以借助一些程序集以及某种框架支持来完成。你至少需要这些东西:
- 一种记录任务当前执行上下文的机制——堆栈、寄存器内容,也许还有其他细节。这本质上是特定于系统的。
- 一个与任务相关的地方,用于存储记录的执行上下文。有多种方式可以建立这样的事情。有希望的替代方案包括 (i) 由操作系统提供;(ii) 由运行在操作系统之上的某种用户态多任务系统提供;(iii) 由编译器内置到任务中。
- 恢复记录的执行上下文的机制——这也是系统特定的。
如果操作系统不提供此类功能,那么您可以将(现已删除的)POSIX 上下文系统视为用于记录和恢复执行上下文的模型接口。(请参阅makecontext()
、swapcontext()
、getcontext()
和setcontext()
。)但是,您需要自己实现这些,并且您可能希望包装它们以向应用程序提供更简单的接口。细节将高度依赖于硬件和底层操作系统。
作为替代方案,您可以通过提供编译器来实现对此类系统的透明多任务支持,这些编译器发出经过特殊检测的代码(即,甚至比您需要的更特殊的检测)。例如,考虑为您自己设计的 VM 生成字节码的编译器。运行结果程序的虚拟机自然会跟踪程序在其中运行的状态,并且可以在一定数量的操作码的每个序列之后产生。