2

与此问题类似,我想在 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 系统在这样做时的不同行为。

这种效果达到吗?如果是这样,以便携式方式?

4

3 回答 3

1

您可以使用线程,也可以让函数轮询计时器(或由SIGALRM处理程序设置的全局变量),然后保存其状态并在分配的时间到期时退出。不推荐使用 ofucontext_t并且永远不应该在新代码中使用,更不用说信号处理程序了。

于 2010-09-14T03:42:27.730 回答
0

我突然想到了我想要的解决方案:goto!我将在我希望限制的函数之后设置一个跳转点,设置一个计时器并在处理 SIG*ALRM 的信号处理程序中简单地跳转到函数之后的指令。

于 2010-09-14T13:35:45.513 回答
0

请注意,您在此处寻找的一般功能称为成本执行。例如,参见WellingsLeung 等人的这篇文章。al. 的好书。上面的答案集中在用户空间中实现它;一些 RTOS 或语言支持它(不是 linux)作为一般机制。

提供此功能的一个示例操作系统是AUTOSAR OS (spec linked)。请注意,此操作系统提供执行时间强制,这与期限强制略有不同。 执行时间的执行变得越来越难,因为它依赖于某种能力来衡量实际花费的成本(通常与硬件合作)。由于当今处理器的复杂性,测量这一点既困难又昂贵——更不用说测量的意义(由于非线性执行和各种其他很酷的东西)很难解释——因此很难计算一个 (对特定代码部分执行时间的最坏或常见)情况估计。

有点跑题了,但是 Ada 在这里在语言级别提供了一组更严格的功能,这对您没有帮助,但是您可以弄清楚这些 Ada 要求是如何在 Linux 中实现的。Ada 语言规范在提供基本原理文档方面是独一无二的,请参阅实时抢先中止部分作为出发点。

于 2010-10-02T13:18:07.597 回答