sem_timedwait()表示特定时间

时间:2015-01-14 15:49:10

标签: c linux pthreads semaphore

我想在信号量上等待20 mili-secound,如下所示,但是当我打印tv_sec和tv_nsec的值变得非常大时。

任何人都可以帮助理解以下代码。

if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
    {
        //throw error
    }
ts.tv_nsec += 20000000;
ts.tv_sec += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;

sem_timedwait(&semaphore, &ts)

2 个答案:

答案 0 :(得分:1)

它应该很大。 clock_gettime(CLOCK_REALTIME,& ts)给出了自大纪元时间以来的刻度,并且您要添加到返回的值。

来自http://man7.org/linux/man-pages/man2/clock_gettime.2.html手册页。

  

所有实现都支持系统范围的实时时钟,由CLOCK_REALTIME标识。它的时间代表自纪元以来的秒和纳秒。当时间改变时,相对间隔的定时器不受影响,但绝对时间点的定时器会受到影响。

来自sem_timedwait(3) - Linux手册页

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

abs_timeout参数指向一个结构,该结构指定自纪元以来的秒和纳秒的绝对超时

答案 1 :(得分:0)

  1. clock_gettime检索当前"日期和时间"以特定格式
  2. timespec结构上的操作正在更新此日期:当前日期+ 20ms(并尝试处理边框效果:如果nsec"溢出"那么我们应该增加sec):所以在ts包含您的信号量的截止日期之后
  3. 信号量等待sem_post或超时。