问题一:
句柄应该表示的是一个线程,,为什么句柄的值不一样呢?
HANDLE g_hand=NULL;
DWORD  WINAPI  SecondThreadFunc( void* pArguments )
{

int i=0; g_hand=GetCurrentThread();
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;

int main()

HANDLE hThread;
hThread =  CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
cout<<hThread<<endl;//
cout<<g_hand<<endl;//  两个句柄的值不一样,,不解
cin.get();
return 0;
}问题二:
为什么DuplicateHandle 将线程伪句柄转换成真句柄的时候,,在线程内部可以转换成功,在主线程却不能转换成功呢?
HANDLE g_hand=NULL;
DWORD  WINAPI  SecondThreadFunc( void* pArguments )
{

int i=0;
g_hand=GetCurrentThread();
/*DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里可以转换成功
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);*/
while(true)
{
Sleep(100);
cout<<"run time "<<i++<<endl;
}
return 0;

int main()

HANDLE hThread;
hThread =  CreateThread(NULL, 0,SecondThreadFunc, NULL, 0, NULL);
Sleep(1000);
DuplicateHandle(GetCurrentProcess(),g_hand,GetCurrentProcess(),//这里不能转换成功 后面用这个句柄 也不会暂停线程  不解
&g_hand,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
SuspendThread(g_hand);
cin.get();
return 0;
}
问题三: OpenThread 返回的是 真句柄 还是伪句柄??

解决方案 »

  1.   

    为什么OpenThread  返回的句柄 用TerminateThread 无法结束线程?
      

  2.   

    1. 你试试在主线程中TerminateThread(g_hand, 0);能够结束子线程吗?
    2. 你主线里g_hand有值吗?就是定义的时候初始化为NULL了。
    3. 把下面的代码加到你的主线程中你看可以结束子线程吗?
    HANDLE handle = OpenThread(THREAD_ALL_ACCESS, FALSE, GetThreadId(hThread));
    TerminateThread(handle, 0);
    CloseHandle(handle);
      

  3.   

    1.在用户层,线程对象的引用句柄可以不同,到了内核,才是固定的
    将伪句柄装成真句柄,并不说明它就和线程第一次创建时的句柄值是一样的
    DuplicateHandle是复制,不是直接转换2.貌似GetCurrentThread()只是返回0xFFFFFFFF,固定值,所以...3.OpenThread真句柄,伪句柄只能用于本线程
      

  4.   

    更正
    GetCurrentProcess()  0xFFFFFFFF
    GetCurrentThread()   0xFFFFFFFE
      

  5.   

    cout<<hThread<<endl;//
    cout<<g_hand<<endl;// 两个句柄的值不一样,,不解
    ===============‘
    DuplicateHandle是复制句柄,所以不一样很正常。为什么DuplicateHandle 将线程伪句柄转换成真句柄的时候,,在线程内部可以转换成功,在主线程却不能转换成功呢?
    ============
    不关DuplicateHandle的事,而是g_hand=GetCurrentThread();得到的是伪句柄,MSDN上面有一句说明:
    The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. 
    这说明伪句柄只能在当前线程中用,出了这个线程就无效了。问题三: OpenThread 返回的是 真句柄 还是伪句柄??
    这个返回的是真句柄。