gettimeofday - проблема в том, что могут иметь более низкие значения, если вы меняете аппаратные часы (например, с NTP)
Boost - недоступно для этого проекта
clock () - обычно возвращает 4-байтовое целое число, что означает, что оно имеет малую емкость, и через некоторое время возвращает отрицательные числа.
Я предпочитаю создавать свой собственный класс и обновлять его каждые 10 миллисекунд, поэтому этот способ более гибкий, и я даже могу улучшить его, чтобы иметь подписчиков.
class MyAlarm {
static int64_t tiempo;
static bool running;
public:
static int64_t getTime() {return tiempo;};
static void callback( int sig){
if(running){
tiempo+=10L;
}
}
static void run(){ running = true;}
};
int64_t MyAlarm::tiempo = 0L;
bool MyAlarm::running = false;
чтобы обновить его, я использую setitimer:
int main(){
struct sigaction sa;
struct itimerval timer;
MyAlarm::run();
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &MyAlarm::callback;
sigaction (SIGALRM, &sa, NULL);
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 10000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 10000;
setitimer (ITIMER_REAL, &timer, NULL);
.....
Посмотрите на setitimer, ITIMER_VIRTUAL и ITIMER_REAL.
Не используйте функции будильника или ualarm, у вас будет низкая точность, когда ваш процесс получит тяжелую работу.