2013-11-02 4 views
1

Я работаю на таймер в настоящее время, таймеры поддерживаются связанный list.Like это:Long precedure в функции обратного вызова таймера

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(); 
     } 
    } 
} 

Вопрос: Когда есть длинный precedure в функции обратного вызова handler (скажем, функция обработчика стоит 500мс для выполнения, то dispatch stucks), остальные таймеры в списке не могут быть обработаны вовремя. Так что нам нужно thread pool? Или есть другие советы?

ответ

2

Проблема задач длительной работы, чередующихся с задачами с малой продолжительностью, является фундаментальной проблемой систем реального времени (и почти в реальном времени). Хорошим решением является отдельный поток для обработки более длинных запущенных задач и делегирование более длинных задач во второй поток. Но ваша долгожданная задача, ожидающая io, или просто тяжелая обработка?

Если задержка вызвана асинхронной обработкой (например, ожиданием на io), вы можете разделить работу на «верхнюю половину» и «нижнюю половину», где «верхняя половина» отправляет io, а затем назначает «нижнюю половину» для проверки результатов. Альтернативами является обработка сигнала от ответа, возможно, с обещанием (действительно интересная техника).

Если задержка возникла из-за тяжелой задачи обработки, вы все равно сможете использовать подобную технику, сформировав свою сложную задачу таким образом, чтобы она «периодически возникала». Threading лучше, но может быть недоступен в некоторых встроенных средах.

+0

Не могли бы вы предоставить какой-нибудь практический код или несколько хороших примеров? Я не могу найти более подробную информацию об этой теме. – prehistoricpenguin

Смежные вопросы