CLOCK_MONOTONIC und pthread_mutex_timedlock / pthread_cond_timedwait
Den pthread_mutex_timedlock Dokumentation sagt, dass abs_timeout
dauert CLOCK_REALTIME
. Aber wir alle wissen, dass es unangebracht ist für das timing einer bestimmten Dauer (wegen der system-Uhrzeit-Einstellungen).
Ist es ein Weg, um pthread lock timeout auf CLOCK_MONOTONIC
dass ist tragbar? Das gleiche geht auch mit pthread_cond_timedwait.
- Es ist nicht unangemessen. Sie müssen nur Ihre Anwendung locale timezone auf UTC.
- Nein. Das bedeutet nicht verhindern, dass Ihr real-time-clock ändern.
- Sie können einen clock-watcher-thread, dass die Sendungen alle registrierten konditioniert Variablen sollte die Uhr rückwärts springen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angeschaut die Dokumentation und die
pthread.h
ich kann nicht einen Weg finden, um pthread_mutex_timedlock verwendenCLOCK_MONOTONIC
also gehe ich davon aus, dass die nicht (derzeit) möglich. Für pthread_cond_timedwait, jedoch, verwenden Sie code wie diesen:Habe ich weggelassen Fehler-code-Kontrolle für die Klarheit, aber natürlich sollte man das tun.
Ich gehe davon aus, dass
CLOCK_REALTIME
verwendet wird, weil es immer verfügbar ist, in der Erwägung, dass im PrinzipCLOCK_MONOTONIC
ist optional. Außerdem Frage ich mich, wenn die Einstellung absolute timeouts macht es leichter, sich zu erholen, nachdem das system Anrufe unterbrochen werden, die durch Signale und dergleichen.Jedoch scheint es ziemlich inkonsequent, dass die Uhr eingestellt werden kann in einigen Fällen und nicht andere - es sollte wirklich ein
pthread_mutexattr_setclock()
ist, aber leider scheint es nicht zu sein. Ich denke, Sie müssen einfach hoffen, dass jemand nicht die Uhr!pthread_condattr_setclock
ist nicht verfügbar unter OS X und ich habe nicht in der Lage gewesen, eine Lösung zu finden, die funktioniert unter OS X.Auf OS X und FreeBSD, die Sie verwenden können
kqueue
undkevent
. Siehe meine Antwort hier: https://stackoverflow.com/a/31174803/432