C 定时器中的长程序';s回调

C 定时器中的长程序';s回调,c,linux,multithreading,timer,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 pseu

我现在正在使用计时器,计时器由链表维护。如下所示:

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
中有一个较长的过程时(比如说,执行handler函数需要500毫秒,然后
dispatch
stuck),列表中的剩余计时器可能无法及时处理。因此,我们需要一个
线程池吗?或者还有其他建议吗?

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

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


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

您能提供一些实用代码或一些好的示例吗?我找不到有关此主题的更多信息。