2012-06-07 27 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