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)
我认为这是我调用线程并将数据传递给它的方式的错误,但我不能通过阅读文档推断出这个错误.有任何想法吗?
GetLastError()您示例中的返回值毫无意义.呼叫GetLastError()调用设置的最后一个错误值(MSDN文档状态的给定函数是否如此与否)Windows API函数后立即才有效.
在您的线程例程中,您调用时GetLastError()不会调用任何设置它的Windows API函数,因此它的返回值不会反映代码导致的任何错误,因此对您来说没有任何意义.
有可能GetLastError()是新启动的线程的值完全没有意义 - 它只是随机的,它被设置为87.更有可能在线程设置期间执行一些生成87错误的代码.如果此代码是在Visual Studio中构建的,或者在不同版本的Windows上运行,则可能会获得不同的值.但无论你能控制或依赖什么,甚至不需要关心它.
| 归档时间: |
|
| 查看次数: |
730 次 |
| 最近记录: |