线程开始时Winapi错误87

Lef*_*ris 1 c winapi multithreading

我有一个困扰我一段时间的问题.我的项目中的每个子线程都正确运行并执行它应该执行的操作,但启动线程并将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;
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Main thread start:Last error is 0
In the thread: Last Error is 87
Main thread finish: Last error is 0
Run Code Online (Sandbox Code Playgroud)

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

shf*_*301 5

GetLastError()您示例中的返回值毫无意义.呼叫GetLastError()调用设置的最后一个错误值(MSDN文档状态的给定函数是否如此与否)Windows API函数后立即才有效.

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

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