【问题标题】:Proper handling of GetLastError (and others) in a multithreaded context在多线程上下文中正确处理 GetLastError(和其他)
【发布时间】:2011-03-26 10:59:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ c multithreading winapi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      the docs 对此毫不含糊:

      GetLastError 函数

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

      所以他们说了三遍(在一个段落中!):应该足够了,正如Lewis Carroll 所说的那样;-)。因此,没有必要回答诸如“但如果它是按进程而不是按线程,那么...?”;-)。

      【讨论】:

      • 我一定是瞎了眼,因为在大家指出之前我没有在 MSDN 文档中看到它。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多