我现在正在做一个定时器,定时器是由一个链表维护的。像这样:
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
中有一个很长的procedure时(比如说handler function执行了500ms,然后dispatch
卡住),list中的rest timers可能不会被处理及时。那么我们这里需要一个线程池
吗?或者还有其他建议吗?
最佳答案
长持续时间任务与短持续时间任务交错的问题是实时(和近实时)系统的一个基本问题。有一个单独的线程来处理运行时间较长的任务,并将较长的任务委托(delegate)给第二个线程是一个很好的解决方案。但是您的长时间运行的任务是在等待 io,还是只是繁重的处理?
如果延迟是由异步处理引起的(例如等待 io),您可以将工作分成“上半部”和“下半部”,其中“上半部”调度 io请求,然后安排“下半部分”来检查结果。替代方案是处理来自响应的信号,可能带有 promise (非常有趣的技术)。
如果延迟是由处理繁重的任务引起的,您仍然可以使用类似的技术,通过以周期性“产生”的方式构建计算繁重的任务。线程更好,但在某些嵌入式环境中可能不可用。
关于c - 定时器回调中的长过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19738677/