2013-08-21 3 views
7

Der Mann Seite von mktime erwähnte Faden nicht die Sicherheit von mktime, aber es tat dies erwähnen, die es wie ein Faden unsicher aussehen: überIst der Standard C mktime thread unter Linux sicher?

Aufruf mktime() setzt auch die externe Variable tzname mit Informationen die aktuelle Zeitzone.

ich auf Linux wissen Mktime ruft tzset tzname zu setzen, die ein Zeichen ist * []:

extern char * tzname [2];

und tzset wird Umgebungsvariable TZ und Datei/etc/localtime lesen. Wenn also nicht alle diese Operationen von Mktime mit einem Mutex geschützt werden, kann ich nicht sehen, wie es Thread-sicher ist.

+0

möglich Duplikat von [C Zeitfunktion Mehrfach-Thread] (http://stackoverflow.com/questions/18348383/c-time-funktion-multiple-thread) –

+0

@ShafikYaghmour Die vorherige Frage und ihre Antworten konzentrieren sich auf 'asctime' "ctime", "gmtime" und "localtime", die Zeiger auf statische Daten zurückgeben und daher vom Entwurf her Thread-unsicher sind. Diese Frage bezieht sich speziell auf 'mktime', deren Schnittstelle nicht Thread-unsicher ist, aber der von POSIX zusätzlich vorgeschriebene Nebeneffekt könnte sein. Daher ist dies kein Duplikat der vorherigen Frage. – user4815162342

+0

das ist richtig, ich denke die ersten zwei Zeilen sind ein bisschen irreführend, die vorherige Frage hat nichts in Bezug auf mktime beantwortet. – swang

Antwort

8

Es ist wahr, dass mktime eine Nebenwirkung hat, aber die Nebenwirkung sollte in den meisten Programmen harmlos sein.

Nach POSIX, wird die Nebenwirkung, als ob tzset aufgerufen wurde, die wiederum nur Kopien der Zeitzone von dem TZ Umgebungsvariable auf die tzname Array von C-Strings. Wenn Ihre Anwendung nicht TZ ändert, haben Sie kein Problem mit dem Aufruf mktime() gleichzeitig.

Zusätzlich zu GNU libc tzsetdoes use a mutex zum Schutz der Integrität von tzname. Dies ist ein Zusatz zur Qualität der Implementierung, der vom Standard nicht garantiert wird.

+0

gut, aber es sieht TZ kann durch viele andere Zeitfunktionen geändert werden, z. strftime oder durch direkten Aufruf von tzset. Auch TZ verweist normalerweise auf eine Datei, die mit/etc/localtime symlinking ist, die jederzeit geändert werden kann? – swang

+0

Sorry hat Ihre Editierung nicht gesehen, das macht mehr Sinn, der ganze TZSET-Aufruf ist durch einen Mutex geschützt, so dass jede Zeitfunktion mit Zeitzoneninformationen am Mutex synchronisiert wird, einschließlich Strptime und Strftime. Das garantiert Thread-Sicherheit, klingt aber für mich sehr ineffizient. – swang

+0

@swang 'tzset' hat einen [schnellen Pfad] (http://sourceware.org/git/?p=glibc.git;a=blame;f=time/tzset.c; hb = 26b4d7667169f8db26fd8194b3c498ec58e50f90 # l173) die ausbucht, wenn sich der Wert der 'TZ'-Umgebungsvariablen nicht geändert hat, ändert sich trotzdem in '/ etc/localtime'. Aus diesem Grund sollte seine Effizienz angemessen sein. – user4815162342