pthread_cond_timedwait函数需要timepec结构中的绝对时间。
我想用什么时间来获取绝对时间。我在网上看到了很多例子,我发现几乎所有时间都使用了功能。 (ftime,clock,gettimeofday,clock_gettime(所有可能的CLOCK _...)。
pthread_cond_timedwait使用绝对时间。这个等待时间是否会因改变机器的时间而受到影响?此外,如果我使用其中一个时间函数获得绝对时间,如果机器的时间在获取和添加增量时间之间发生变化,这将影响等待时间?是否有可能等待相对时间的事件?
答案 0 :(得分:14)
要使用的函数是clock_gettime()
,其条件变量的时钟id。默认情况下,此时钟ID为CLOCK_REALTIME
,但可以通过使用已调用CLOCK_MONOTONIC
的{{1}}初始化条件变量来更改(例如pthread_condattr_t
}。
使用pthread_condattr_setclock()
不是一个好主意,因为这不能保证等于time()
的{{1}}。在某些情况下,这可能会导致您的程序忙于等待tv_sec
达到clock_gettime(CLOCK_REALTIME)
不久前已达到的秒数。
答案 1 :(得分:2)
我自己使用了clock_gettime
和CLOCK_REALTIME
。这应该可以令人满意地工作,并允许您轻松地创建一个绝对时间规格来超时。
确实,在您进行等待设置时,机器时间可能会提前。一般情况下,如果你等待足够长的时间,那么你就不会像你希望的那样接近你所要求的唤醒时间。如果你的请求时间已经超过了timedwait呼叫的时间,它应该立即唤醒。
Solaris提供pthread_cond_reltimedwait_np
,(np表示非可移植)但我不知道Linux上有任何此类功能。我建议等待绝对时间,如果需要的话,实施亲戚自己等待。
答案 2 :(得分:0)
timespec
只是以秒为单位的时间(time_t
),具有额外的纳秒。您可以使用cond_relative_timed_wait
的相对时间。
从“time.h”以time_t
格式调用time(NULL);
获取当前系统时间。更准确的是使用
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
也将返回纳秒。
也可以使用其他功能,但最终结果必须转换为秒数和纳秒数。