我想實現一個後臺用戶空間程序,它將在Linux中每100ms執行一次各種任務和計算。我可以通過在Linux中使用報警信號來實現這一點,下面的結構是我實現間隔計時器的方式。在Linux中使用C++實現低開銷間隔計時器
void timer_handler (int signum){
printf("In timer handler!\n");
}
int main(){
struct sigaction s_action;
struct itimerval timer;
/* Set Up a Timer */
/* Install timer_handler as the signal handler for SIGVTALRM. */
memset (&s_action, 0, sizeof (s_action));
s_action.sa_handler = &timer_handler;
sigaction (SIGVTALRM, &s_action, NULL);
/* Timer configuration for 100ms */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 100000;
/* Set up the timer */
setitimer (ITIMER_VIRTUAL, &timer, NULL);
while(1);
}
但是,由於無限循環,這種方法似乎不是最佳的方法(就性能而言)。它顯着增加了CPU利用率。一旦它開始在後臺運行,我的其他程序的性能會下降15%。
我最想要的是有一個程序,除非發生定時器中斷,否則會保持睡眠狀態。多線程似乎是一種選擇,但我對這個主題並不很有經驗。我將不勝感激任何有關如何以最小的開銷實施此類計劃的建議或指示。
如果你想讓你的程序進入睡眠狀態,爲什麼不調用sleep()? – 2014-11-04 20:00:08
我首先嚐試睡眠,但沒有奏效。使用sleep()或nanosleep(),我的定時器處理程序似乎從未觸發。我從警報(2)手冊頁讀取了sleep()可能會干擾SIGALRM信號。 – jake 2014-11-04 21:59:26