Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

12.01.2015, 14:27

Steht ja da auskommentiert: Er hat localtime_s falsch benutzt (nicht genügend Parameter übergeben).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

12.01.2015, 15:29

Der Grund liegt nämlich daran, dass "localtime" nur auf der Windows-Plattform threadsicher ist und threadlokalen Speicher nutzt. (Siehe MSDN bei "Remarks") Auf Linux hingegen ist die Funktion explizit nicht threadsicher und liegt nicht im Thread lokalen Speicher, was zu sehr schwer zu findenden Bugs führen kann. (Siehe Linux mal page bei "Notes")

Inwiefern schränkt das die Portabilität von localtime() ein?

Ich bin auch kein Fan von Funktionen, die internen, globalen Zustand modifizieren oder gar nach außen reichen (strtok() wäre ein weiteres Beispiel, einige andere Dinge, wie z.B. errno, sind mittlerweile offenbar garantiert threadlocal). Aber die Aussage, dass durch nicht garantierte Threadsafety die Portabilität in irgendeiner Weise eingeschränkt oder gar die Nutzung der Funktion rein prinzipiell "unsicher" würde, ist falsch, insbesondere, da der Threadersteller sicherlich nicht vorhat, localtime() aus mehreren Threads parallel aufzurufen (ka wieso überhaupt jemand sowas würde machen wollen)... ;)


PS: So wie's aussieht, wurden einige der *_s Funktionen (localtime_s() inklusive) mittlerweile in den C-Standard aufgenommen...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (12.01.2015, 15:39)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

13

12.01.2015, 22:30

Es schränkt die Portabilität der Funktion insofern ein, dass sie unter Windows immer funktioniert und unter anderen Betriebssystem in seltenen Fällen unregelmäßig nicht.

Ich persönlich kann mich nicht erinnern, dass ich die Funktion bisher jemals in der Praxis benötigt habe. Mich brauchst du also auch nicht fragen, wann man das brauchen könnte. ^^

Ich wollte nur anmerken, dass die Standardfunktion ausgerechnet auf anderen Betriebssystem in dem Fall nicht so problemlos ist, wie sie scheint.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

13.01.2015, 10:12

Es schränkt die Portabilität der Funktion insofern ein, dass sie unter Windows immer funktioniert und unter anderen Betriebssystem in seltenen Fällen unregelmäßig nicht.

Ich wollte nur anmerken, dass die Standardfunktion ausgerechnet auf anderen Betriebssystem in dem Fall nicht so problemlos ist, wie sie scheint.

Nur weil der Standard nicht vorschreibt, dass die Funktion threadsicher zu sein hat, heißt noch lange nicht, dass sie manchmal nicht funktioniert. Das einzige, was das heißt, ist, dass man eben für die entsprechende Sychronisation zu sorgen hat. Die Funktion funktioniert, ist portabel und, wie so ziemlich alles in C, bei korrekter Benutzung auch sicher... ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

13.01.2015, 10:51

Wer sicher sein will, wrappt die Funktion halt einfach und benutzt ein Mutex, dann hat sich die Sache.

Werbeanzeige