Funktion zur überprüfung von funktionswerten
-
errno is a preprocessor macro used for error indication. It expands to a static (until C++11) thread-local (since C++11) modifiable lvalue of type int.
https://en.cppreference.com/w/cpp/error/errno
Finde jetzt gerade nichts zu C , aber da wird es nicht anders sein, wenn Threads unterstützt werden.errno is a preprocessor macro (but see note below) that expands to a thread-local (since C11) modifiable lvalue of type int.
-
@Wutz sagte in Funktion zur überprüfung von funktionswerten:
Das ist richtig, errno & Co. sind aber globale Variablen und somit nicht threadsafe.
siehe hier: 'errno is thread-local; setting it in one thread does not affect its value in any other thread.'
https://linux.die.net/man/3/errnoaber globale variablen verwendet der brave coder sowieso nicht.
-
Ihr habt alle keine Ahnung - wie kann eine (globale) Variable threadsafe sein, wenn <thread.h>, TLS,... gemäß C-Sprachstandard C99 und höher nur optional ist? -- Genau! Nie.
Im Übrigen garantiert der Standard nie eine konkrete Implementierung - hier also die Benutzung von errno in Standardlib-Funktionen -, auch das würdet ihr wissen, wenn ihr die Grundidee vom Standard verstanden hättet - nämlich kein Programmierlehrbuch zu sein, sondern eine Handlungsrichtlinie für Compilerbauer, und dabei eben nicht konkrete Implementierungen vorzuschreiben sondern möglichst viele Freiheiten zu lassen.
Das Aufschnappen und Nachplappern von Pauschalaussagen und Weisheiten aus dem Netz entledigt nicht vom eigenen Nachdenken.
-
-
@Wutz: Wir reden hier aber von konkreten Implementierungen, nicht vom Sprachstandard per se. Also halt du dich daraus!
-
Wir reden hier nicht von konkreten Implementierungen, weil wir von Pauschalaussagen "errno ist threadsafe" reden.
Wer lesen kann ist klar im Vorteil.
-
@Wutz sagte in Funktion zur überprüfung von funktionswerten:
Ihr habt alle keine Ahnung - wie kann eine (globale) Variable threadsafe sein, wenn <thread.h>, TLS,... gemäß C-Sprachstandard C99 und höher nur optional ist? -- Genau! Nie.
errno ist nicht für die interprozess-kommunikation geeignet. solange dein programm nur in einem einzigen thread läuft, funktioniert errno. ein multithreading-errno, wenn es denn einer braucht, muss er sich schon selber programmieren. libraries die atomic integers anbieten gibt es ja.
-
@Bushmaster sagte in Funktion zur überprüfung von funktionswerten:
@Wutz sagte in Funktion zur überprüfung von funktionswerten:
Ihr habt alle keine Ahnung - wie kann eine (globale) Variable threadsafe sein, wenn <thread.h>, TLS,... gemäß C-Sprachstandard C99 und höher nur optional ist? -- Genau! Nie.
errno ist nicht für die interprozess-kommunikation geeignet. solange dein programm nur in einem einzigen thread läuft, funktioniert errno. ein multithreading-errno, wenn es denn einer braucht, muss er sich schon selber programmieren. libraries die atomic integers anbieten gibt es ja.
Das ist falsch. Errno ist nicht für die Interprzesskommunikation gedacht. errno ist in jeweils einem Thread gültig.
-
@Wutz: "errno ist threadsafe" hat - außer dir - keiner hier geschrieben (wer lesen kann ist klar im Vorteil)!
Außerdem aus errno:
Note: Until C11, the C standards had contradictory requirements, in that they said that errno is a macro but also that "it is unspecified whether errno is a macro or an identifier declared with external linkage". C11 fixes this, requiring that it be defined as a macro (see also WG14 N1338).
Es ist also seit C11 (also dem bis jetzt aktuellen Standard) auf jeden Fall ein Makro und keine globale Variable (und vorher war es eben ungenau spezifiziert)!
-
@manni66 sagte in Funktion zur überprüfung von funktionswerten:
@Bushmaster sagte in Funktion zur überprüfung von funktionswerten:
@Wutz sagte in Funktion zur überprüfung von funktionswerten:
Ihr habt alle keine Ahnung - wie kann eine (globale) Variable threadsafe sein, wenn <thread.h>, TLS,... gemäß C-Sprachstandard C99 und höher nur optional ist? -- Genau! Nie.
errno ist nicht für die interprozess-kommunikation geeignet. solange dein programm nur in einem einzigen thread läuft, funktioniert errno. ein multithreading-errno, wenn es denn einer braucht, muss er sich schon selber programmieren. libraries die atomic integers anbieten gibt es ja.
Das ist falsch. Errno ist nicht für die Interprzesskommunikation gedacht. errno ist in jeweils einem Thread gültig.
sag ich doch. jeder thread hat sein eigenes errno.
-
@Th69 sagte in Funktion zur überprüfung von funktionswerten:
@Wutz: "errno ist threadsafe" hat - außer dir - keiner hier geschrieben (wer lesen kann ist klar im Vorteil)!
er meint das wohl so, dass ein thread die errno eines anderen threads weder lesen noch ändern kann.