2010-08-06 164 views
8

假設GetLastError(和變體)是每個線程還是每個進程?如果它是每個進程的問題在多線程應用程序中顯而易見,因爲無法保證在失敗的調用和GetLastError之間沒有其他Win32調用。有時GetLastError的值很重要。正確處理多線程上下文中的GetLastError(及其他)

例如,如果使用IO完成端口,AcceptEx將返回FALSE(失敗)。 WSAGetLastError(類似於GetLastError)將返回ERROR_IO_PENDING來通知您它已掛起並且失敗不是由於其他原因導致的。問題是可能有數十個以太網呼叫正在運行並覆蓋此值。

這些調用是線程特定還是特定進程?如果過程具體,那麼你如何正確處理?

回答

13

the docs是絕對不含糊一下:

GetLastError函數

檢索調用線程的 最後錯誤代碼值。代碼的最後錯誤 保持在每個線程 的基礎上。多線程不會 覆蓋對方的最後一個錯誤 代碼。

所以他們說了三次(在一個單獨的段落中):應該夠了,因爲Lewis Carroll表示;-)。因此,沒有必要回答諸如「但是如果是每個進程而不是每個線程的假設,那麼......怎麼樣?」;-)。

+0

+1提及劉易斯卡羅爾。 – 2010-08-06 17:12:53

+0

我必須失明,因爲我沒有在MSDN文檔中看到它,直到每個人都指出它。 – 2010-08-06 17:16:36

+0

+1表示明顯。 – 2010-08-06 17:21:23

2

這兩個GetLastErrorWSAGetLastError返回每個線程的錯誤代碼。看一看在MSDN條目:

  • GetLastError:返回值是調用線程的最後錯誤代碼。
  • WSAGetLastError:WSAGetLastError函數返回調用線程發生的最後一個錯誤。
1

您可以在MSDN上閱讀(見http://msdn.microsoft.com/en-us/library/ms679360.aspx)對您的問題明確的答案:

檢索調用線程的 最後錯誤代碼值。代碼的最後錯誤 保持在每個線程 的基礎上。多線程不會 覆蓋對方的最後一個錯誤 代碼。