摘自<<Windows核心编程>>, 第六章.
这段叙述没有看明白, 还要烦劳诸位帮忙解释一下:将伪句柄转换为实句柄有时可能需要获得线程的实句柄而不是它的伪句柄. 所谓"实句柄", 我是指用来明确标识一个独一无二的线程的句柄. 请看下面的代码: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);
// Funcion continues...
}你能发现这个代码段存在的问题吗? 这个代码的目的是让父线程给子线程传递一个线程句柄, 以标识父线程. 但是, 父线程传递了一个伪句柄, 而不是一个实句柄. 当子线程开始运行时, 它将一个伪句柄传递给GetThreadTime函数, 使自线程得到它自己的CPU时间, 而不是父线程的CPU时间. 出现这种情况的原因是线程的伪句柄是当前线程的句柄, 也就是说, 它是调用函数的线程的句柄.
这段叙述没有看明白, 还要烦劳诸位帮忙解释一下:将伪句柄转换为实句柄有时可能需要获得线程的实句柄而不是它的伪句柄. 所谓"实句柄", 我是指用来明确标识一个独一无二的线程的句柄. 请看下面的代码: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);
// Funcion continues...
}你能发现这个代码段存在的问题吗? 这个代码的目的是让父线程给子线程传递一个线程句柄, 以标识父线程. 但是, 父线程传递了一个伪句柄, 而不是一个实句柄. 当子线程开始运行时, 它将一个伪句柄传递给GetThreadTime函数, 使自线程得到它自己的CPU时间, 而不是父线程的CPU时间. 出现这种情况的原因是线程的伪句柄是当前线程的句柄, 也就是说, 它是调用函数的线程的句柄.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货