1

我有一个问题困扰了我一段时间。我的项目中的每个子线程都在正确运行,并且除了以设置为 87 的 Last Error 开始线程之外,它应该做它应该做的事情。

根据 Win32 系统错误,87 表示无效参数。由于 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

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

4

2 回答 2

5

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

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

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

于 2012-06-07T05:48:47.913 回答
3

您必须记住,最后一个错误只有在最后一个调用的函数返回错误时才是可靠

于 2012-06-07T05:48:50.937 回答