Ist es richtig anzunehmen, dass GetLastError (und Varianten) per-Thread oder pro Prozess ist? Die Probleme, wenn es pro Prozess ist, sind in Multithread-Anwendungen etwas offensichtlich, da es keine Möglichkeit gibt, sicherzustellen, dass keine anderen Win32-Aufrufe zwischen Ihrem fehlgeschlagenen Aufruf und GetLastError vorgenommen wurden. Manchmal ist der Wert von GetLastError wichtig.
AcceptEx wird beispielsweise FALSE (Fehler) zurückgeben, wenn Sie IO-Completion-Ports verwenden. WSAGetLastError (ähnlich wie GetLastError) gibt ERROR_IO_PENDING zurück, um Sie darüber zu informieren, dass es gebunden ist und der Fehler nicht auf etwas anderes zurückzuführen ist. Das Problem ist, dass Dutzende von anderen Anrufen im Flug sein können und diesen Wert überschreiben können.
Sind diese Anrufe Thread-spezifisch oder prozessspezifisch? Wenn prozessspezifisch dann wie gehst du richtig damit um?
die Dokumente sind absolut eindeutig:
GetLastError-Funktion
Ruft den aufrufenden Thread ab Wert des letzten Fehlercodes Der letzte Fehler Code wird auf einem Pro-Thread beibehalten Basis. Mehrere Threads nicht überschreiben einander den letzten Fehler Code.
Also sagten sie es dreimal (in einem einzigen Absatz!): sollte genug sein, sagte Lewis Carroll ; -). Daher ist es nicht notwendig, Hypothesen zu beantworten, wie "aber wenn es pro Prozess anstatt pro Thread war, was ist dann ...?"; -).
Sowohl GetLastError
als auch WSAGetLastError
geben Fehlercodes pro Thread zurück. Sehen Sie sich die MSDN-Einträge an:
Tags und Links c c++ multithreading winapi