У меня есть рабочий поток, который получает работу из трубы. Как то так
void *worker(void *param) {
while (!work_done) {
read(g_workfds[0], work, sizeof(work));
do_work(work);
}
}
Мне нужно реализовать 1-секундный таймер в том же потоке, чтобы вести бухгалтерский учет работы. Вот что я имею в виду:
void *worker(void *param) {
prev_uptime = get_uptime();
while (!work_done) {
// set g_workfds[0] as non-block
now_uptime = get_uptime();
if (now_uptime - prev_uptime > 1) {
do_book_keeping();
prev_uptime = now_uptime;
}
n = poll(g_workfds[0], 1000); // Wait for 1 second else timeout
if (n == 0) // timed out
continue;
read(g_workfds[0], work, sizeof(work));
do_work(work); // This can take more than 1 second also
}
}
Я использую системное время работы вместо системного времени, потому что системное время может изменяться во время работы этого потока. Мне было интересно, есть ли другой лучший способ сделать это. Я не хочу рассматривать использование другого потока. Использование alarm()
не вариант, так как он уже используется другим потоком в том же процессе. Это внедряется в среде Linux.