c - 定时器回调中的长过程

标签 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中有一个很长的procedure时(比如说handler function执行了500ms,然后dispatch卡住),list中的rest timers可能不会被处理及时。那么我们这里需要一个线程池吗?或者还有其他建议吗?

最佳答案

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

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

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

关于c - 定时器回调中的长过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19738677/

相关文章:

c - 创建 pthread 时出现段错误

if 子句可以用作循环吗? (数据结构,C语言)

Java:语句未按顺序执行

java - 使用错误管理在 Java 中运行多线程

c - 在 Linux 中使用 pthreads 时是否必须在线程结束后关闭线程?

python - 有没有办法通过 zipimport 使用已编译的 C 模块?

c++ - 在 QLabel 中隐藏或裁剪重叠文本?

c - 在控制台的输入空间添加一个字符串

c - C 中文件读取的奇怪行为

c++ - 如何将套接字动态绑定(bind)到一个网络接口(interface)?