1

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

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

然后我使用一个线程调用dispatchsleep 并从列表中选择计时器。代码简化如下:

//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();
        }
    }
}

问题: 当回调函数中有一个很长的precedure时handler(比如handler函数执行耗时500ms,然后dispatch卡住了),列表中的rest timers可能无法及时处理。那么这里需要一个thread pool吗?或者有没有其他建议?

4

1 回答 1

2

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

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

如果延迟是由处理繁重的任务引起的,您仍然可以使用类似的技术,通过以周期性“产生”的方式形成计算繁重的任务。线程更好,但在某些嵌入式环境中可能不可用。

于 2013-11-02T07:00:57.570 回答