定时器回调中的长程序

时间:2013-11-02 03:30:40

标签: c linux multithreading timer

我现在正在研究计时器,计时器由链表维护。就像这样:

struct timer
{
    struct timer* prev;
    struct timer* next;
    struct timespec start;
    struct timespec interval;
    void* par; 
    int (*handler) (void* par);
};

然后我使用一个名为dispatch的线程来休眠并从列表中选择定时器。代码简化如下:

//just pseudo code here
void dispatch() {
    for (;;) {
        while (list_empty()) {
            wait();
        }
        timer* ptr = listhead();
        if (timer_begin(ptr)) {
            ptr->handler(ptr->par);
            list_pop_front();
        }
    }
}

问题: 当回调函数handler中有一个很长的步骤(比如处理函数执行需要500ms,然后dispatch卡住)时,列表中的其余计时器可能无法及时处理。所以我们做需要thread pool吗?或者还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

长持续时间任务与短持续时间任务交错的问题是实时(和近实时)系统的基本问题。拥有一个单独的线程来处理更长时间运行的任务,并将更长的任务委托给第二个线程是一个很好的解决方案。但是你的长期任务是等待io,还是只是重处理?

如果延迟是由异步处理引起的(例如等待io),你可能会将工作拆分为“上半部分”和“下半部分”,其中“上半部分”调度io请求,然后安排“下半部分”检查结果。替代方案是处理来自响应的信号,可能带有承诺(非常有趣的技术)。

如果延迟是由处理繁重的任务造成的,您可能仍然可以使用类似的技术,通过以定期“收益”的方式形成计算繁重的任务。线程更好,但在某些嵌入式环境中可能无法使用。

相关问题