【问题标题】:Is using timers/signals in c static libraries bad practice?在 c 静态库中使用计时器/信号是不好的做法吗?
【发布时间】:2013-05-14 13:00:20
【问题描述】:

我正在构建两个静态 c 库。每个库都有一个例程,需要在调用 mylib_init() 后每秒运行一次;

我使用 setitimer 在每个库中实现了这一点,它使用 ITIMER_REAL 资源和 SIGALRM 信号。

void Start1msTimer()
{
    struct itimerval new;
    memset(&new,0, sizeof(new));

    new.it_interval.tv_sec=1;
    new.it_value.tv_sec=1;

    signal (SIGALRM, OneSecTimeout);
    setitimer (ITIMER_REAL, &new,NULL);
}

到目前为止一切正常。

现在我正在构建一个使用这两个库的示例应用程序,并且出现了冲突。我已经意识到一个应用程序对于每个信号只能有一个处理程序,而 ITIMER_REAL 只能用于一个计时器,不能同时用于两者。所以很明显现在事情不正常了。

在我的每个库中实现计时的更好方法是什么?

一般来说,在库中包含任何信号处理程序是不是一个坏主意?

【问题讨论】:

    标签: c linux timer signals


    【解决方案1】:

    是的,在库中“用完”应用程序级资源是一个非常糟糕的主意,因为使用该库的应用程序开发人员不会对如何分配资源有发言权。

    而且,正如您所发现的,当多个库想要拥有相同的资源时,您会遇到互操作性问题。

    解决此问题的一种方法是排除要求,使用函数mylib_update() 并记录应用程序必须每秒调用一次。这就留下了如何将这种基于计时器的更新的问题留给它所属的应用程序。

    【讨论】:

    • 谢谢,我想我有很多重构工作要做​​。
    【解决方案2】:

    您可以使用线程 + 同步方法。您无需编写信号处理程序,而是编写线程。使用信号量,您甚至可以在超时或按需运行事件线程(即应用​​调用一个发布信号量的库函数)。

    【讨论】:

    • 谢谢我最终做了这样的事情,但没有信号量。我刚刚创建了调用 usleep() 的线程,这段时间我想在两次调用之间等待。
    猜你喜欢
    • 2013-05-23
    • 2011-02-14
    • 2011-09-22
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2012-08-17
    相关资源
    最近更新 更多