我有一个困扰我一段时间的问题。我的项目中的每个子线程都正常运行并执行它应该执行的操作,但启动线程并将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
我认为这是我调用线程并将数据传递给它的方式的错误,但是我不能通过阅读文档来推断出这个错误。有什么想法吗?
答案 0 :(得分:5)
示例中GetLastError()
的返回值毫无意义。调用GetLastError()
仅在调用设置最后一个错误值的Windows API函数后立即生效(MSDN文档说明给定函数是否这样做)。
在您的线程例程中,您调用GetLastError()
而不调用任何设置它的Windows API函数,因此其返回值不会反映您的代码导致的任何错误,因此对您来说没有任何意义。
GetLastError()
的值可能是一个新启动的线程完全没有意义 - 它只是随机的,它被设置为87.更有可能在线程设置期间执行一些生成87错误的代码。如果此代码是在Visual Studio中构建的,或者在不同版本的Windows上运行,则可能会获得不同的值。但无论你控制或依赖甚至不需要关心什么都不是。
答案 1 :(得分:3)
你必须记住,如果最后一个被调用的函数返回错误,那么最后一个错误只是可靠的。