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


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

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

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


10183
2018-06-09 13:31


起源



答案:


要使用的功能是 clock_gettime() 使用条件变量的时钟id。这个时钟ID是 CLOCK_REALTIME 默认情况下可以更改(例如 CLOCK_MONOTONIC)通过用a初始化条件变量 pthread_condattr_t 哪个 pthread_condattr_setclock() 被称为。

运用 time() 不是一个好主意,因为这不能保证是平等的 tv_sec 一个 clock_gettime(CLOCK_REALTIME)。在某些情况下,这可能会导致程序忙碌等待 time() 达到已经达到的第二个 clock_gettime(CLOCK_REALTIME) 不久前。


14
2017-11-21 16:19



clock_gettime(CLOCK_MONOTONIC)是获得时间的方式,该时间只会增加,因此不会因改变系统时间而受到影响。使用CLOCK_MONOTONIC使用pthread_condattr_setclock初始化条件的属性将使pthread_cond_timedwait等待相对时间。 - Vincent


答案:


要使用的功能是 clock_gettime() 使用条件变量的时钟id。这个时钟ID是 CLOCK_REALTIME 默认情况下可以更改(例如 CLOCK_MONOTONIC)通过用a初始化条件变量 pthread_condattr_t 哪个 pthread_condattr_setclock() 被称为。

运用 time() 不是一个好主意,因为这不能保证是平等的 tv_sec 一个 clock_gettime(CLOCK_REALTIME)。在某些情况下,这可能会导致程序忙碌等待 time() 达到已经达到的第二个 clock_gettime(CLOCK_REALTIME) 不久前。


14
2017-11-21 16:19



clock_gettime(CLOCK_MONOTONIC)是获得时间的方式,该时间只会增加,因此不会因改变系统时间而受到影响。使用CLOCK_MONOTONIC使用pthread_condattr_setclock初始化条件的属性将使pthread_cond_timedwait等待相对时间。 - Vincent


我用过 clock_gettime 同 CLOCK_REALTIME 我。这应该令人满意,并允许您轻松创建一个绝对时间规格来超时。

实际上,在您进行等待设置时,机器时间可能会提前。一般情况下,如果你等待足够长的时间,这将无关紧要,你将不会像你希望的那样接近你所要求的唤醒时间。如果您在timedwait呼叫发出之前已经过了所请求的时间,那么它应该立即唤醒。

Solaris提供 pthread_cond_reltimedwait_np,(np表示非便携式),但我不知道Linux上有任何此类功能。我建议等待绝对时间,如果需要的话,实施亲戚自己等待。


2
2018-06-09 15:30



遗憾的是没有 CLOCK_MONOTONIC基于版本。 - caf
CLOCK_REALTIME的clock_gettime在低级别资源上是否“重”? - Vincent
我不相信,但最好的方法是找出你的具体应用,如果它显示了 clock_gettime是一个重大问题,然后尝试优化它。 - Mark B
根据你的第二段,软件的行为可能与时间变化接近,这可能非常危险。我认为应该避免使用pthread_cond_timedwait。 - Vincent
@caf你可以致电[pthread_condattr_setclock] [^ 1]事先使用 CLOCK_MONOTONIC 有了这个功能。 [^ 1]: pubs.opengroup.org/onlinepubs/009695399/functions/... - LnxPrgr3


timespec 只是几秒钟的时间(time_t)额外的纳秒。你可以使用相对时间 cond_relative_timed_wait

获取当前系统时间 time_t 表格电话 time(NULL); 来自“time.h”。更准确的是使用

timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

这将返回纳秒。

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


0
2018-06-09 13:55



我找不到函数cond_relative_timed_wait()的定义。在哪里定义? - Vincent