在multithreading上下文中正确处理GetLastError(和其他)

假设GetLastError(和变体)是每个线程还是每个进程是正确的? 如果它是per-process的问题在multithreading应用程序中有些明显,因为没有办法保证在失败的调用和GetLastError之间没有进行其他Win32调用。 有时,GetLastError的值很重要。

例如,如果使用IO完成端口,则AcceptEx将返回FALSE(失败)。 WSAGetLastError(类似于GetLastError)将返回ERROR_IO_PENDING以通知您它已被挂起并且失败不是由于其他原因造成的。 问题是,有数十个其他呼叫可以在飞行中并覆盖此值。

这些调用是特定于线程还是特定于进程? 如果是特定于流程,那么如何正确处理?

这些文档对此非常明确:

GetLastError函数

检索调用线程的最后错误代码值。 最后一个错误代码是基于每个线程维护的。 多个线程不会覆盖彼此的最后一个错误代码。

所以他们说了三次(在一个段落中!):应该足够了,正如刘易斯卡罗尔所说;-)。 因此,没有必要回答假设,例如“但如果它是每个过程而不是每个线程,那么……怎么样?”;-)。

GetLastErrorWSAGetLastError返回每线程错误代码。 看看MSDN条目:

  • GetLastError :返回值是调用线程的最后错误代码。
  • WSAGetLastError :WSAGetLastError函数返回调用线程发生的最后一个错误。

您可以在MSDN上阅读(请参阅http://msdn.microsoft.com/en-us/library/ms679360.aspx )关于您的问题的明确答案:

检索调用线程的最后错误代码值。 最后一个错误代码是基于每个线程维护的。 多个线程不会覆盖彼此的最后一个错误代码。