2015-09-28 2 views
6

Scheint, wie wenig eine dumme Frage, aber es hat mich zum Nachdenken ...Ist die C-Funktion timetime() auch dann sicher, wenn ein NULL-Parameter angegeben wird?

Nach here wird time erforderlich Thread-sicher auf einem konformes System zu sein, richtig? Diese Anforderung gilt unabhängig von den Parametern der Funktion. Einige Funktionen sind nicht als Thread-sicher aufgeführt, wenn ein Argument NULL bereitgestellt wird, und time ist nicht enthalten.

So sieht es aus wie ausreichend POSIX kompatibles System sollte eine Thread-sichere Implementierung von time haben.

Aber könnte ein POSIX-System wählen, time_t in einer Angelegenheit zu implementieren, die es tatsächlich zu einem Zeiger macht und immer noch kompatibel ist? Wenn also ein NULL-Parameter zum Speichern des Ergebnisses bereitgestellt wird, wären dann nicht alle Wetten auf die Thread-Sicherheit aus, da es wahrscheinlich einen Zeiger auf einen statischen Speicher zurückgibt. Oder gibt es eine Anforderung oder Konvention für time_t, die ich in diesem Aspekt vermisse?

Wie sollte ich überprüfen, ob time auf einigen Plattformen UNIX threadsicher ist? Insbesondere AIX, HP-UX, Linux und Solaris. Das Durchlaufen der Disassemblierung in einem Debugger könnte funktionieren, aber die Implementierungen können sich ändern.

+6

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html: Time_t und clock_t wird integer oder Echt floating Typen sein. Ihre Zuweisung sollte Thread-sicher sein. – marcolz

+0

'Zeit' ist eine alberne Funktion wie es ist. Wir können die Signatur nicht aus Kompatibilitätsgründen brechen, aber es gab wenig Grund, es noch närrischer zu machen und Thread-unsichere Implementierungen zuzulassen. – MSalters

+0

@marcolz Danke. Ich bin mir nicht sicher, wie ich das vermisst habe. – Kizaru

Antwort

4

Ja, es ist Thread-sicher.

time_t time(NULL); 

Wenn es einen internen Wert, an dem Punkt, setzte sie zurück, es würde immer aus dem internen Wert auf den Rückgabewert kopieren (registrieren?). Diese Kopie würde es threadsicher machen, da es in alle modernen Einzelkopie-Prozessoren passen würde.

mov eax, static_internal_value 
return 

Stellen Sie sich vor, dass nicht der Fall war, und 2 Fäden kamen sie beide den gleichen Wert abschreiben würden -. Wieder, kann nicht sehen, wie dies falsch sein könnte.

thread 1         thread 2 
              mov eax, static_internal_value 
mov eax, static_internal_value 
return 
              return 
+0

Ein paar Dinge. Ich war mir nicht bewusst, dass "time_t" eine Ganzzahl oder ein Fließkommatyp sein muss. Das wirft meine hypothetische Zeigersituation aus. Zweitens nimmt Ihr Beitrag einen atomaren Doppelwortspeicher an. Das stimmt normalerweise, aber die x86-Architektur ist nicht der Bogen der Plattformen, die ich aufgelistet habe. Selbst mit der Anforderung, dass "time_t" eine Ganzzahl oder ein Gleitkommawert sein muss, könnte eine kompatible Implementierung ein 8 Byte "time_t" haben, das auf einigen Plattformen keine atomare Ladung/Speicherung haben kann. Die POSIX-Spezifikation besagt, dass "Zeit" Thread-sicher sein muss, und so ist es auch. – Kizaru

Verwandte Themen