The pthread_mutex_timedlock documentation says that abs_timeout
takes a CLOCK_REALTIME
. However, we all know that it is inappropriate for timing a specific duration (due to system time adjustments).
Is there a way to make pthread lock timeout on CLOCK_MONOTONIC
that is portable? The same goes with pthread_cond_timedwait.
Having looked at the documentation and pthread.h
, I can't find a way to make pthread_mutex_timedlock use CLOCK_MONOTONIC
so I assume that's not (currently) possible. For pthread_cond_timedwait, however, you can use code like this:
pthread_condattr_t attr;
pthread_cond_t cond;
/* ... */
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);
I've omitted error code checking for clarity, but of course you should do that.
I assume that CLOCK_REALTIME
is used because it's always available whereas in principle CLOCK_MONOTONIC
is optional. Also, I wonder if setting absolute timeouts makes it easier to recover after system calls get interrupted by signals and the like.
However, it does seem quite inconsistent that the clock can be set in some cases and not others - there really should be a pthread_mutexattr_setclock()
, but alas there does not seem to be one. I guess you'll just have to hope someone doesn't set the clock!
On OS X and FreeBSD, you can use kqueue
and kevent
. See my answer here: https://stackoverflow.com/a/31174803/432
There is no way to change clock for pthread_mutex_timedlock in GLIBC yet. Maybe it's due to backward compatibility, the MONOTONIC clock was introduced later than REALTIME, so there are a lot of software which is using such function and replacement CLOCK may affect on this.
Solution/s for Linux:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With