Po obejrzeniu dokumentacji i pthread.h
, nie mogę znaleźć sposobu na wykonanie pthread_mutex_timedlock użycia CLOCK_MONOTONIC
, więc zakładam, że nie jest (obecnie) możliwe. Dla pthread_cond_timedwait jednak, można użyć kodu:
pthread_condattr_t attr;
pthread_cond_t cond;
/* ... */
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);
ja pominięty kod błędu sprawdzania dla jasności, ale oczywiście należy zrobić.
Zakładam, że CLOCK_REALTIME
jest używany, ponieważ jest zawsze dostępny, podczas gdy w zasadzie CLOCK_MONOTONIC
jest opcjonalny. Zastanawiam się również, czy ustawienie bezwzględnych limitów czasu ułatwia odzyskiwanie po tym, jak wywołania systemowe zostaną przerwane przez sygnały i tym podobne.
Jednak wydaje się dość niekonsekwentne, że zegar można ustawić w niektórych przypadkach, a nie innych - naprawdę powinien być pthread_mutexattr_setclock()
, ale niestety nie wydaje się być jeden. Chyba musisz po prostu mieć nadzieję, że ktoś nie ustawi zegara!
To nie jest niewłaściwe. Musisz tylko ustawić strefę czasową swojej aplikacji na UTC. –
@ MahmoudAl-Qudsi Nie. To nie przeszkadza w zmianie zegara czasu rzeczywistego. –
Możesz użyć wątku obserwatora zegara, który transmituje wszystkie zarejestrowane zmienne warunkowe, jeśli zegar przeskoczy do tyłu. –