pthread_mutex_timedlock 文档说需要abs_timeout
一个. CLOCK_REALTIME
但是,我们都知道对特定持续时间进行计时是不合适的(由于系统时间调整)。
有没有办法让 pthread 锁定超时CLOCK_MONOTONIC
是可移植的?pthread_cond_timedwait 也是如此。
查看了文档和pthread.h
,我找不到使用pthread_mutex_timedlockCLOCK_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
是可选的。另外,我想知道设置绝对超时是否可以在系统调用被信号等中断后更容易恢复。
但是,在某些情况下可以设置时钟而不是在其他情况下设置时钟似乎非常不一致 - 确实应该有一个pthread_mutexattr_setclock()
,但可惜似乎没有。我想你只需要希望有人没有设置时钟!
在 OS X 和 FreeBSD 上,您可以使用kqueue
和kevent
. 在这里查看我的答案:https ://stackoverflow.com/a/31174803/432
目前还没有办法在 GLIBC中更改pthread_mutex_timedlock的时钟。可能是因为向后兼容的原因,MONOTONIC 时钟是在 REALTIME 之后推出的,所以有很多软件在使用这个功能,更换 CLOCK 可能会影响到这一点。
Linux 解决方案: