我正在构build两个静态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); }
好吧,一切都很好。
现在我正在构build一个使用这两个库的示例应用程序,并且出现冲突。 我已经意识到一个应用程序只能有一个处理程序的每个信号,ITIMER_REAL只能用于一个计时器,而不是两个。 所以显然现在不行。
对我来说,在我的每个图书馆中实施时间安排将会是更好的方式吗?
一般来说,在一个库中有任何信号处理程序是不是一个好主意?
你可以使用线程+同步方法。 写一个信号处理程序,而不是写一个线程。 使用信号量,你甚至可以在超时或按需运行事件线程(即应用程序调用信号量的库函数)。
是的,在库中“使用”应用程序级资源是一个非常糟糕的主意,因为使用该库的应用程序开发人员在分配资源的方式上没有发言权。
而且,正如您发现的那样,当多个库想要拥有相同的资源时,您会遇到互操作性问题。
解决这个问题的一个方法是将需求mylib_update()
出来,并且有一个函数mylib_update()
并记录应用程序必须每秒调用一次。 这就产生了如何在应用程序中实现这种基于计时器的更新的问题。