我需要在pthread_cond_timedwait上使用什么时间函数?

时间:2010-06-09 13:31:13

标签: c++ c linux synchronization pthreads

pthread_cond_timedwait函数需要timepec结构中的绝对时间。

我想用什么时间来获取绝对时间。我在网上看到了很多例子,我发现几乎所有时间都使用了功能。 (ftime,clock,gettimeofday,clock_gettime(所有可能的CLOCK _...)。

pthread_cond_timedwait使用绝对时间。这个等待时间是否会因改变机器的时间而受到影响?此外,如果我使用其中一个时间函数获得绝对时间,如果机器的时间在获取和添加增量时间之间发生变化,这将影响等待时间?是否有可能等待相对时间的事件?

3 个答案:

答案 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_gettimeCLOCK_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);

也将返回纳秒。

也可以使用其他功能,但最终结果必须转换为秒数和纳秒数。