CLOCK_MONOTONIC和pthread_mutex_timedlock/pthread_cond_timedwait

Zac*_*Saw 19 c c++ linux mutex pthreads

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

有没有办法让pthread锁定超时CLOCK_MONOTONIC可移植?pthread_cond_timedwait也是如此.

Car*_*roo 20

看了文档后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);
Run Code Online (Sandbox Code Playgroud)

为清楚起见,我省略了错误代码检查,当然你应该这样做.

我认为CLOCK_REALTIME使用它是因为它始终可用,而原则上CLOCK_MONOTONIC是可选的.此外,我想知道设置绝对超时是否会在系统调用被信号等中断后更容易恢复.

然而,在某些情况下可以设置时钟而不是其他情况下看起来确实非常不一致 - 确实应该有a pthread_mutexattr_setclock(),但唉似乎没有.我猜你只是希望有人不设时钟!

  • 这在Linux上很好用.OS X上没有`pthread_condattr_setclock`,我找不到适用于OS X的解决方案. (4认同)