2013-01-09 5 views
16

pthread_mutex_timedlock documentation mówi, że abs_timeout ma CLOCK_REALTIME. Jednak wszyscy wiemy, że jest to niewłaściwe dla określonego czasu trwania (ze względu na korekty czasu systemu).CLOCK_MONOTONIC i pthread_mutex_timedlock/pthread_cond_timedwait

Czy jest jakiś sposób, aby ustawić limit czasu blokady pthread na CLOCK_MONOTONIC, który jest przenośny? To samo dotyczy pthread_cond_timedwait.

+0

To nie jest niewłaściwe. Musisz tylko ustawić strefę czasową swojej aplikacji na UTC. –

+4

@ MahmoudAl-Qudsi Nie. To nie przeszkadza w zmianie zegara czasu rzeczywistego. –

+0

Możesz użyć wątku obserwatora zegara, który transmituje wszystkie zarejestrowane zmienne warunkowe, jeśli zegar przeskoczy do tyłu. –

Odpowiedz

17

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!

+3

To jest dobre na Linuksie. 'pthread_condattr_setclock' nie jest dostępny na OS X i nie byłem w stanie znaleźć rozwiązania, które działa na OS X. – andrewrk

+0

Wygląda na to, że inni ludzie też się na to natknęli: https://github.com/nanomsg/nanomsg/issues/ 10 – Cartroo

+0

Mam zamiar zrobić kilka eksperymentów, ale może natknąłem się na rozwiązanie tutaj: http://stackoverflow.com/questions/11338899/are-there-any-well-behaved-posix-interval-timers/ 31174803 # 31174803 – andrewrk

Powiązane problemy