Korrekte Behandlung von GetLastError (und anderen) in einem Multithread-Kontext

8

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?

    
Karl Strings 06.08.2010, 17:05
quelle

3 Antworten

13

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 ...?"; -).

    
Alex Martelli 06.08.2010, 17:09
quelle
2

Sowohl GetLastError als auch WSAGetLastError geben Fehlercodes pro Thread zurück. Sehen Sie sich die MSDN-Einträge an:

  • GetLastError : Der Rückgabewert ist der letzte Fehlercode des aufrufenden Threads.
  • WSAGetLastError : Die WSAGetLastError-Funktion gibt den letzten Fehler zurück, der beim Aufruf aufgetreten ist thread.
casablanca 06.08.2010 17:09
quelle
1

Sie können auf MSDN lesen (siehe Ссылка ) klare Antwort auf Ihre Frage:

  

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.

    
Oleg 06.08.2010 17:10
quelle

Tags und Links