Warum keine threadsichere alternative zu localtime()?
-
Wie viele sicherlich wissen, wandelt die funktion std::localtime ein std::time_t in ein std::tm welches man benötigt, um die aktuelle lokale Zeit und Datum auszugeben. Dabei liefert sie einen Pointer auf eine statische std::tm Instanz zurück. Zu C-Zeiten aus denen die Funktion stammt, war so etwas sicherlich eine praktikable Lösung da der Standard nichts von Threadsgwusste. Dies ist bei mehreren Threads in C++11 natürlich anders da jeder parallele Aufruf von std::localtime eine Race Condition erzeugen kann, da jeder das Ergebnis für alle anderen Aufrufer verändert.Nun könnte man sagen das ist ja auch eine C-Funktion die man mit C++ nicht mehr benutzen sollte, nur: Mit C++11 Chrono braucht man genau diese Funktion zu Datumsausgabe. Eine Andere Möglichkeit gibt es gar nicht. Warum zwingt einen c++11 zur Benutzung einer Funktion die man mit C++11 eigentlich gar nicht nutzen darf. Damit ist std::chrono meines Erachtens broken, auch wenn es es sich sicher nutzen lässt solange man kein konkretes Datum oder Uhrzeit benötigt. Warum gibt es da nichts zeitgemäßes zudem der Umweg über std::localtime ohnehin unintuitiv und umständlich ist und vom Interface überhaupt nicht zu std::chrono passt.
-
chrono ist nicht zum Zeitpunkt bestimmen designed worden, sondern fuer Zeitmessungen und Timer waehrend der Programmlaufzeit.
Schau dir mal boost/local_time an: http://www.boost.org/doc/libs/1_55_0/doc/html/date_time/local_time.html
-
Marthog schrieb:
chrono ist nicht zum Zeitpunkt bestimmen designed worden, sondern fuer Zeitmessungen und Timer waehrend der Programmlaufzeit.
Schon klar, aber wenn man eine Funktion system_clock::to_time_t anbietet würde ich auch erwarten, dass sich diese sinnvoll nutzen lässt. Auch ist so völlig unverständlich, warum die eigentlich recht nützliche Funktion std::put_time Einzug in C++11 gehalten hat. Das wäre ja alles super nützlich wenn es funktionieren würde, was noch schlechter ist als wenn es gar nicht vorhanden wäre.
Marthog schrieb:
Schau dir mal boost/local_time an: http://www.boost.org/doc/libs/1_55_0/doc/html/date_time/local_time.html
Kenne ich und ist recht nützlich. Nur blöd, wenn man kein boost nutzen kann.
-
Kann man dann nicht einfach ein thread-sicheres localtime selber schreiben? Ist doch nicht so kompliziert?
-
Arcoth schrieb:
Kann man dann nicht einfach ein thread-sicheres localtime selber schreiben? Ist doch nicht so kompliziert?
Keine Ahnung, ich wüsste zumindest nicht spontan, wie ich das machen sollte. Mir ging es aber auch weniger um konkrete Praxis als darum die Entscheidungen des c++ standard committee zu verstehen.
-
die Entscheidungen des c++ standard committee zu verstehen
ist reine Zeitverschwendung.