在多线程上下文中正确处理GetLastError(和其他)

Kar*_*ngs 9 c c++ winapi multithreading

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

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

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

Ale*_*lli 17

这些文档对此非常明确:

GetLastError函数

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

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