2012-06-07 55 views
1

我有一個問題困擾了我一段時間。在我的項目中的每個子線程運行正常,並做什麼是應該在87Winapi Error 87開始線程問題

87開頭的最後錯誤設置線程的例外,做根據的Win32系統錯誤表示無效參數。由於LastError是線程特定的,並且從ThreadProc函數的第一行開始,似乎設置了唯一可以推斷的是ThreadProc函數本身在語法上(?)在某種程度上是錯誤的。

我的操作系統是Windows 7 x64,編譯器是gcc版本4.6.2 我做了一個小例子程序,它在我的系統啓動帶有錯誤87集的子線程。

#include <windows.h> 

DWORD WINAPI THREAD_FUNCTION(LPVOID t) 
{ 
    printf("In the child thread: Last Error is %lu\n",GetLastError()); 
    return 0; 
} 

typedef struct thread_data 
{ 
    //just an id for example's sake 
    uint32_t id; 
}thread_data; 

int main() 
{ 
    HANDLE thread; 
    thread_data d; 
    d.id = 1; 
    printf("Main thread start:Last error is %lu\n",GetLastError()); 
    //create the thread 
    thread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) THREAD_FUNCTION,(LPVOID)&d,0, NULL); 
    //wait for it 
    WaitForSingleObject(thread,INFINITE); 
    CloseHandle(thread); 
    printf("Main thread finish: Last error is %lu\n",GetLastError()); 
    return 0; 
} 

此輸出:

Main thread start:Last error is 0 
In the thread: Last Error is 87 
Main thread finish: Last error is 0 

我想這是我所說的線程和傳遞數據的方式錯誤,但我不能閱讀文檔推斷此錯誤。有任何想法嗎?

+0

你應該在WaitForSingleObject之後調用'CloseHandle(thread);'。 – Lundin

+0

我知道,這只是我用來演示我的問題的一個小例子程序。爲了清楚起見,將進行編輯。謝謝 – Lefteris

回答

5

GetLastError()在你的例子返回值是沒有意義的。調用GetLastError()僅在調用設置最後一個錯誤值(MSDN文檔以指明給定函數是否如此)的Windows API函數後立即生效。

在你的線程例程中,你調用的是GetLastError()而不調用任何可以設置它的Windows API函數,所以它的返回值並不反映你的代碼造成的任何錯誤,所以對你來說沒有任何意義。

GetLastError()是一個新啓動的線程的值可能是完全沒有意義的 - 它只是隨機的,它被設置爲87.更有可能是線程設置期間執行的一些代碼會生成87錯誤。如果此代碼是在Visual Studio中構建的或在不同版本的Windows上運行,則可能會得到不同的值。但是不管它不是你能夠控制或依賴甚至需要關心的東西。

+0

感謝您的回答。這是一個如此簡單的解釋,現在讓我感到很無聊>。> – Lefteris

3

您必須記住最後一個錯誤是可靠的如果最後一個調用的函數返回錯誤。

+0

感謝您的回答。這是一個如此簡單的解釋,現在讓我感到很傻。「 – Lefteris