123456

 

伪句柄

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

 

posted on 2011-07-04 10:00  hgy413  阅读(159)  评论(0编辑  收藏  举报

导航