12 Stimmen

Welche Zeitfunktion muss ich mit pthread_cond_timedwait verwenden?

Die Funktion pthread_cond_timedwait benötigt eine absolute Zeit in einer time timespec-Struktur.

Welche Zeitfunktion soll ich verwenden, um die absolute Zeit zu erhalten? Ich habe viele Beispiele im Internet gesehen und ich habe fast alle Zeitfunktionen verwendet. (ftime, clock, gettimeofday, clock_gettime (mit allen möglichen CLOCK_...).

Die Funktion pthread_cond_timedwait verwendet eine absolute Zeit. Wird diese Wartezeit durch eine Änderung der Uhrzeit des Rechners beeinflusst? Auch wenn ich die absolute Zeit mit einer der Zeitfunktionen ermittle, wird die Wartezeit beeinflusst, wenn sich die Zeit der Maschine zwischen der Ermittlung und der Addition der Deltazeit ändert? Gibt es eine Möglichkeit, stattdessen auf ein Ereignis mit einer relativen Zeit zu warten?

16voto

jilles Punkte 9914

Die zu verwendende Funktion lautet clock_gettime() mit der Clock-ID der Bedingungsvariablen. Diese Uhrenkennung ist CLOCK_REALTIME standardmäßig, kann aber geändert werden (z. B. in CLOCK_MONOTONIC ) durch Initialisierung der Bedingungsvariablen mit einem pthread_condattr_t worauf pthread_condattr_setclock() aufgerufen wurde.

Verwendung von time() ist keine gute Idee, denn es ist nicht garantiert, dass sie gleich tv_sec de un clock_gettime(CLOCK_REALTIME) . In einigen Fällen kann dies dazu führen, dass Ihr Programm auf die time() um die zweite zu erreichen, die bereits von clock_gettime(CLOCK_REALTIME) vor kurzer Zeit.

2voto

Mark B Punkte 93261

Ich habe die clock_gettime con CLOCK_REALTIME mich selbst. Das sollte zufriedenstellend funktionieren und es Ihnen ermöglichen, auf einfache Weise einen absoluten Zeitwert für die Zeitüberschreitung zu erstellen.

Es besteht in der Tat die Möglichkeit, dass die Maschinenzeit weiterläuft, während Sie die Wartezeit einrichten. Wenn die Wartezeit so kurz ist, dass dies eine Rolle spielt, werden Sie im Allgemeinen nicht so nah an die gewünschte Weckzeit herankommen, wie Sie hoffen. Wenn die gewünschte Zeit zum Zeitpunkt des timedwait-Aufrufs bereits verstrichen ist, sollte die Maschine sofort aufwachen.

Solaris bietet pthread_cond_reltimedwait_np (np steht für non-portable), aber mir ist keine derartige Funktion unter Linux bekannt. Ich würde vorschlagen, einfach auf die absolute Zeit zu warten und, falls nötig, selbst eine relative Wartezeit zu implementieren.

-1voto

adf88 Punkte 4121

timespec ist lediglich eine Zeitangabe in Sekunden ( time_t ) mit zusätzlichen Nanosekunden. Sie können die relative Zeit mit cond_relative_timed_wait .

Um die aktuelle Systemzeit in time_t Formularaufruf time(NULL); aus "time.h". Genauer wäre es, Folgendes zu verwenden

timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

die auch Nanosekunden zurückgibt.

Es können auch andere Funktionen verwendet werden, aber das Endergebnis muss in Sekunden und Nanosekunden umgerechnet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X