Boost timed_wait Schaltsekunden-problem

Ich bin mit dem timed_wait aus der boost C++ library und ich bin immer ein problem mit den Schaltsekunden.

Hier ist ein quick-test:

#include <boost/thread.hpp>
#include <stdio.h>
#include <boost/date_time/posix_time/posix_time.hpp>

int main(){
        //Determine the absolute time for this timer.
        boost::system_time tAbsoluteTime = boost::get_system_time() + boost::posix_time::milliseconds(35000);

        bool done;
        boost::mutex m;
        boost::condition_variable cond;

        boost::unique_lock<boost::mutex> lk(m);
        while(!done)
        {
            if(!cond.timed_wait(lk,tAbsoluteTime))
            {
                done = true;
                std::cout << "timed out";
            }
        }
        return 1;
}

Den timed_wait Funktion zurückgibt 24 Sekunden früher als es sein sollte. 24 Sekunden wird die aktuelle Anzahl der Schaltsekunden in UTC.

So, boost ist weit verbreitet, aber ich konnte nicht finden alle Informationen über dieses Besondere problem. Hat sonst noch jemand dieses problem erlebt? Was sind die möglichen Ursachen und Lösungen?

Hinweise: ich bin mit boost 1.38 auf einem linux-system. Ich habe gehört, dass dieses problem geschieht nicht auf MacOS.

UPDATE: EIN wenig mehr info: Dies passiert auf 2 redhat Maschinen mit kernel 2.6.9. Ich habe ausgeführt, den gleichen code auf einer ubuntu-Maschine mit dem kernel 2.6.30 und der timer verhält sich wie erwartet.

So, was ich denke ist, dass dies ist wahrscheinlich verursacht durch das Betriebssystem oder durch einige mis-Konfiguration auf der redhat Maschinen.

Habe ich codiert umgehen, stellt die Zeit auf UTC und bekommen als der Unterschied von dieser Anpassung und hinzufügen der ursprünglichen Zeit. Diese seens wie eine schlechte Idee zu mir, weil, wenn dieser code ausgeführt wird, auf einen Rechner ohne dieses problem, es könnte sein, 24s VOR. Immer noch konnte den Grund nicht finden für diese.

  • Ich verstehe es nicht. Sie sind die Einstellung timeout-Zeit von 0,5 Sekunden in die Zukunft, aber es ist das timing 24 Sekunden zu früh? Etwas nicht auf.
  • Dies ist nur ein Beispiel aus der Dokumentation. Ich werde es ändern, um besser reflektieren zu meinem Fall.
  • Jetzt, da wir festgestellt haben, dass dein Beispiel-code ist nichts, wie Ihre tatsächliche Anwendung, habe ich noch eine Frage: sind Sie mit einer aktuellen Zeit plus offset wie im Beispiel), oder sind Sie der Dekodierung einer bestimmten Zeit in einem boost::system_time?
  • Mein code ist genau, wie im Beispiel, deswegen habe ich es hier gepostet. Der einzige Unterschied ist, dass die Millisekunden offset die Eingabe eines Benutzers und, dass mein code mit Kommentaren 🙂
  • Umm, Nein ist es nicht. Die aktuelle TAI-UTC-Versatz beträgt 34 Sekunden. Sie sind offenbar stecken 1988: maia.usno.navy.mil/ser7/tai-utc.dat
  • wir nur Sorge um die Sekunden nach dem Beginn der Epoche (1970).
  • Dein Beispiel funktioniert bei mir mit Boost-1.41 auf Ubuntu 9.10.
  • Wie sind Sie auf der Anmeldung Ihre timer-Ereignisse? Vielleicht ist das problem mit Ihrem logger? Versuchen Sie den Druck direkt auf der standard-Ausgabe aus und Messen Sie mit Ihrer Uhr in Echtzeit.
  • Nur eine Idee... sind Sie läuft ein NTP-daemon auf dieser Maschine?

InformationsquelleAutor Isac | 2010-05-06
Schreibe einen Kommentar