Я написал тестовую программу, которая создала posix-таймер на 1 мс. При запуске программы в одиночку или отладке с помощью GDB время является точным.Затем я помещаю тестовую программу в код своего проекта. Когда я запускаю свою проектную программу, таймер также точен, но если я отлаживаю свой проект с помощью GDB, таймер не синхронизируется правильно.
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define CLOCKID CLOCK_REALTIME
timer_t timer_id;
int timer_thread_cnt = 0;
void timer_thread(union sigval v)
{
timer_thread_cnt++;
printf("timer thread count <%d>\n", timer_thread_cnt);
}
int start_timer(void)
{
struct sigevent evp;
int ret;
memset(&evp, 0, sizeof(struct sigevent));
evp.sigev_value.sival_int = 111; /* it can be passed into callback */
evp.sigev_notify = SIGEV_THREAD; /* The thread notifying way -- dispatch a new thread. */
evp.sigev_notify_function = &timer_thread; /* The thread address */
if (timer_create(CLOCKID, &evp, &timer_id) == 0) { /* create timer */
struct itimerspec it;
it.it_interval.tv_sec = 0;
it.it_interval.tv_nsec = 1000000;
it.it_value.tv_sec = 0;
it.it_value.tv_nsec = 1000000;
printf("timer start...");
if (timer_settime(timer_id, 0, &it, NULL) == -1) { /* if timer create success, start it */
printf("start timer failed!\n");
if (timer_delete(timer_id) == -1) {
printf("timer delete failed!\n");
}
return -1;
}
} else {
printf("fail to timer_create");
return -1;
}
return 0;
}
int main(void)
{
start_timer();
while(1){
sleep(1);
}
}
Если таймер не настроен правильно, после запуска программы в течение 10 секунд значение переменной timer_thread_cnt
в программе составляет около 2000. Кстати, если время составляет 10 мс, проблем не будет.Кто-нибудь знает, какова возможная причина этой проблемы.