与此相似 问题, ,我想限制功能的执行时间 - 以微秒准确性最好 - 在C中,我想可以使用C ++异常来获得类似于 Python解决方案。尽管它不是理想的,但是这种方法在普通C中完全无法使用。

那么,我想知道,如何在POSIX系统上的C中的一定时间间隔后中断函数的执行?对于相对简单的情况 愚蠢的业务 工作正常,但这为问题解决方案添加了相当多的代码正交。假设我有这样的功能:

void boil(egg *e) {
    while (true)
    do_boil(e);
}

我想在鸡蛋上滚动煮沸*,每50μs中断一次检查以下操作:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

我意识到Pthreads可以用来做到这一点,但是我对避免使用的使用更感兴趣。一世 可以 在Sigalrm处理程序中的UContext_T之间切换,但是POSIX标准指出,SetContext/SwapContext的使用不适用于信号处理程序中,实际上,我注意到Linux和Solaris系统之间的行为不同。

是这种效果 可能的 实现?如果是这样,以便携式方式?

有帮助吗?

解决方案

只是要注意,您在这里寻找的一般能力被称为 成本执行. 。例如,请参阅本文 或IN Leung等。 Al。的伟大书籍. 。上面的答案侧重于在用户空间中实现它。一些RTO或语言将其作为一般机制支持(不是Linux)。

提供此功能的一个示例OS Autosar OS(规格链接). 。请注意,此操作系统提供 执行时间执行, ,这与 执行截止日期。 执行时间执行不断越来越困难,因为它依赖于测量实际支出的实际成本(通常是使用硬件合作)的能力。由于当今处理器的复杂性,很难衡量这一点 - 更不用说测量的含义(由于非线性执行和所有其他酷炫的东西)很难解释 - 因此很难计算A(代码执行时间的特定部分的最坏情况或常见的案例估计。

略有主题,但ADA在这里的语言级别提供了更严格的功能,这对您无济于事,但是您可以弄清楚如何在Linux中实现这些ADA要求。 ADA语言规范在提供理由文档时是独一无二的,请参见有关 实时的先发制人中断 作为出发点。

其他提示

您可以使用线程,也可以将函数轮询一个计时器(或设置为全局变量 SIGALRM 处理程序),然后保存其状态并在分配的时间到期后退出。用于 ucontext_t 被弃用,绝不应在新代码中使用,而不是信号处理程序。

我想要的解决方案突然发生在我身上:Goto!我希望限制功能,设置一个计时器和信号处理程序后,我将设置一个跳跃点,该信号处理程序处理SIG*ALRM,只需在功能之后跳到指令即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top