我需要在代码中使用一些计时器。我有这样的事情:
struct sigevent ec;
ec.sigev_notify = SIGEV_THREAD;
ec.sigev_value.sival_ptr = &c_timer;
ec.sigev_notify_function = c_thread;
ec.sigev_notify_attributes = NULL;
secs = floor(c);
nsecs = (long long) SECOND * (c - secs);
printf("%ds\t%lldns\n\n",secs,nsecs);
it1c.it_value.tv_sec = secs;
it1c.it_value.tv_nsec = nsecs;
it1c.it_interval.tv_sec = 0;
it1c.it_interval.tv_nsec = 0;
timer_create(CLOCK_PROCESS_CPUTIME_ID, &ec, &c_timer);
timer_settime(c_timer, 0, &it1c, NULL);
其中c_thread是一个设置新计时器的简单函数,SECOND是:
#define SECOND 1000000000
c类似于2.25
我的问题是这个计时器在应该的时候不会调用c_thread。当我将CLOCK_PROCESS_CPUTIME_ID更改为CLOCK_REALTIME时,一切正常,并且它被调用,但是当我使用第一个时,没有任何事情发生。我还使用具有clock_gettime函数的其他CLOCK_REALTIME计时器检查CLOCK_PROCESS_CPUTIME_ID,并且时钟值达到我的it_value。
任何想法可能出错?
我的第二个问题:有没有办法将一些参数传递给使用定时器调用线程的函数?
答案 0 :(得分:2)
@annamataris问题与spinlock和nanosleep的东西无关。有理由只使用CLOCK_REALTIME,因为。
POSIX定时器系统调用首次出现在Linux 2.6中。之前 这个,glibc提供了一个不完整的用户空间实现 (仅限CLOCK_REALTIME定时器)使用POSIX线程,并在glibc中 2.17之前的版本,实现可以追溯到这种技术 在运行2.6之前的Linux内核的系统上。
阅读 man timer_create 了解更多信息。