我现在正在研究计时器,计时器由链表维护。就像这样:
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
吗?或者还有其他建议吗?
答案 0 :(得分:2)
长持续时间任务与短持续时间任务交错的问题是实时(和近实时)系统的基本问题。拥有一个单独的线程来处理更长时间运行的任务,并将更长的任务委托给第二个线程是一个很好的解决方案。但是你的长期任务是等待io,还是只是重处理?
如果延迟是由异步处理引起的(例如等待io),你可能会将工作拆分为“上半部分”和“下半部分”,其中“上半部分”调度io请求,然后安排“下半部分”检查结果。替代方案是处理来自响应的信号,可能带有承诺(非常有趣的技术)。
如果延迟是由处理繁重的任务造成的,您可能仍然可以使用类似的技术,通过以定期“收益”的方式形成计算繁重的任务。线程更好,但在某些嵌入式环境中可能无法使用。