2010-08-06 11 views
8

¿Es correcto suponer que GetLastError (y variantes) son por subproceso o es por proceso? Los problemas si es por proceso son algo obvios en las aplicaciones multiproceso porque no hay forma de garantizar que no se hayan realizado otras llamadas Win32 entre su llamada fallida y GetLastError. A veces, el valor de GetLastError es importante.Manejo adecuado de GetLastError (y otros) en un contexto multiproceso

Por ejemplo, AcceptEx devolverá FALSE (error) si está utilizando puertos de terminación de E/S. WSAGetLastError (similar a GetLastError) devolverá ERROR_IO_PENDING para informarle que está pendiente y que la falla no se debe a otra cosa. El problema es que docenas de otras llamadas pueden estar en vuelo y sobrescribir este valor.

¿Son estas llamadas específicas del hilo o del proceso? Si es específico del proceso, ¿cómo maneja esto correctamente?

Respuesta

13

the docs son absolutamente inequívoca acerca de esto:

GetLastError Función

Recupera valor de código último error del subproceso de llamada. El código de último error se mantiene por cada subproceso . Los subprocesos múltiples no sobrescriben el último código de error .

Así que lo dijeron tres veces (¡en un solo párrafo!): Debería ser suficiente, como Lewis Carroll dijo ;-). Por lo tanto, no hay necesidad de responder a hipotéticas como "pero si fue por proceso en lugar de por hilo, ¿qué pasa con ...?" ;-).

+0

+1 por mencionar a Lewis Carroll. –

+0

Debo estar ciego porque no lo vi en los documentos de MSDN hasta que todos lo señalaron. –

+0

+1 para señalar lo obvio. –

2

Ambos GetLastError y WSAGetLastError devuelven los códigos de error por subproceso. Echar un vistazo a las entradas de MSDN:

  • GetLastError: El valor de retorno es el último código de error del subproceso de llamada.
  • WSAGetLastError: La función WSAGetLastError devuelve el último error que ocurrió para el hilo de llamada.
1

Usted puede leer en MSDN (ver http://msdn.microsoft.com/en-us/library/ms679360.aspx) respuesta clara a su pregunta:

Recupera valor de código último error del subproceso de llamada. El código de último error se mantiene por cada subproceso . Los subprocesos múltiples no sobrescriben el último código de error .

Cuestiones relacionadas