线程开始时Winapi错误87

时间:2012-06-07 05:41:13

标签: c multithreading winapi

我有一个困扰我一段时间的问题。我的项目中的每个子线程都正常运行并执行它应该执行的操作,但启动线程并将Last 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

我认为这是我调用线程并将数据传递给它的方式的错误,但是我不能通过阅读文档来推断出这个错误。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

示例中GetLastError()的返回值毫无意义。调用GetLastError()仅在调用设置最后一个错误值的Windows API函数后立即生效(MSDN文档说明给定函数是否这样做)。

在您的线程例程中,您调用GetLastError()而不调用任何设置它的Windows API函数,因此其返回值不会反映您的代码导致的任何错误,因此对您来说没有任何意义。

GetLastError()的值可能是一个新启动的线程完全没有意义 - 它只是随机的,它被设置为87.更有可能在线程设置期间执行一些生成87错误的代码。如果此代码是在Visual Studio中构建的,或者在不同版本的Windows上运行,则可能会获得不同的值。但无论你控制或依赖甚至不需要关心什么都不是。

答案 1 :(得分:3)

你必须记住,如果最后一个被调用的函数返回错误,那么最后一个错误只是可靠的