Я работаю с приложением, где требование выполняет функцию через каждые 100 мс. Ниже мой код
checkOCIDs()
{
// Do something that might take more than 100ms of time
}
void TimeOut_CallBack(int w)
{
struct itimerval tout_val;
int ret = 0;
signal(SIGALRM,TimeOut_CallBack);
/* Configure the timer to expire after 100000 ... */
tout_val.it_value.tv_sec = 0;
tout_val.it_value.tv_usec = 100000; /* 100000 timer */
/* ... and every 100 msec after that. */
tout_val.it_interval.tv_sec = 0 ;
tout_val.it_interval.tv_usec = 100000;
checkOCIDs();
setitimer(ITIMER_REAL, &tout_val,0);
return ;
}
Функция TimeOut_CallBack() вызывается только один раз, а затем функция checkOCIDs() должна выполняться после непрерывного ожидания 100 мс. В настоящее время приложение работает для блока, поскольку функция checkOCIDs() занимает более 100 мс времени, и до этого запускается таймер. Я не хочу использовать while (1) со сном()/usleep(), поскольку он сильно поглощает мой процессор. Пожалуйста, предложите альтернативу для выполнения моих требований.
Неясно, должна ли выполняться функция "проверка" во время ее выполнения, а таймер истекает. Возможно, было бы хорошо, если бы вы представили переменную, указав, что таймер истек, и ваша функция должна быть выполнена снова после ее завершения, псевдокод:
static volatile bool check_in_progress = false;
static volatile bool timer_expired = false;
void TimeOut_CallBack(int w)
{
// ...
if (check_in_progress) {
timer_expired = true;
return;
}
// spawn/resume check function thread
// ...
}
void checkThreadProc()
{
check_in_progress = true;
do {
timer_expired = false;
checkOCIDs();
} while(timer_expired);
check_in_progress = false;
// end thread or wait for a signal to resume
}
Обратите внимание, что для предотвращения условий гонки может потребоваться дополнительная синхронизация (например, когда один поток существует, а цикл while и check_in_progress все еще установлен, а другой устанавливает timer_expired, функция проверки не будет выполнена), но это зависит от ваших требований.
Foo()
каждые N миллисекунд, у вас есть подразумеваемое требование, чтоFoo
должен работать в течение 100 мс. ЕслиFoo()
находится вне вашего контроля, вы не можете указать требования дляFoo
, даже косвенно. Кроме того, требование подразумевает, что вы не можете использоватьFoo
.