CLOCK_MONOTONIC和pthread_mutex_timedlock / pthread_cond_timedwait

pthread_mutex_timedlock文档说abs_timeout需要CLOCK_REALTIME 。 但是,我们都知道,由于系统时间的调整,对特定的持续时间进行计时是不合适的。

有没有办法使CLOCK_MONOTONIC是可移植的pthreadlocking超时? pthread_cond_timedwait也是一样。

Solutions Collecting From Web of "CLOCK_MONOTONIC和pthread_mutex_timedlock / pthread_cond_timedwait"

看了文档和pthread.h ,我找不到使pthread_mutex_timedlock使用CLOCK_MONOTONIC的方法,所以我认为这不是(当前)可能的。 但是,对于pthread_cond_timedwait ,您可以使用如下代码:

 pthread_condattr_t attr; pthread_cond_t cond; /* ... */ pthread_condattr_init(&attr); pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); pthread_cond_init(&cond, &attr); 

为了清晰起见,我省略了错误代码检查,但是当然你应该这样做。

我假定CLOCK_REALTIME被使用,因为它始终可用,而CLOCK_MONOTONIC原则CLOCK_MONOTONIC是可选的。 另外,我不知道设置绝对超时是否能够在系统调用被信号中断之后更容易恢复。

但是,在某些情况下可以设置时钟,而不是其他的时钟 – 实际上应该有一个pthread_mutexattr_setclock() ,但是似乎并不是这样。 我想你只能希望有人不设定时钟!

在OS X和FreeBSD上,你可以使用kqueuekevent 。 看到我的答案在这里: https : //stackoverflow.com/a/31174803/432