伪句柄
DWORD WINAPI ParentThread(PVOID pvParam) { HANDLE hThreadParent = GetCurrentThread(); CreateThread(NULL, 0 , ChildThread, (PVOID)hThreadParent, 0, NULL); //Function continues... } DWORD WINAPI ChildThread(PVOID pvParam) { HANDLE hThreadParent = (HANDLE) pvParam; FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime; GetThreadTimes(hThreadParent, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime); // Function continues... }
这个代码的目的是让父线程给子线程传递一个线程句柄,以标识父线程。但是,父线程传递了一个伪句柄,而不是一个实句柄。当子线程开始运行时,它将一个伪句柄传递给G e t T h r e a d Ti m e函数,使子线程得到它自己的C P U时间,而不是父线程的C P U时间
答:伪句柄和句柄都能代表一个核心对象,并且通过他们都能进行对核心对象的操作,比如CloseHandle等。
但是伪句柄只是一个壳,他在线程间传递的时候,句柄所引用的东西是目标对象的,不是自身的。也就是说,在不同的线程中,他映射的对象不一样。而且伪句柄在传递过程中不会引起引用计数的增减。
可以用DuplicateHandle将伪句柄转换成实句柄,同时源句柄引用计数加1。
具体参看核心编程第6章
另可参考:http://blog.csdn.net/ouyang2008/article/details/1009760