第一篇,第二章 之 CreateThread(),CloseHandle()

HANDLE CreateThread(

     LPSECURITY_ATTRIBUTES      lpThreadAttributes,             //in,win95 之后,忽略此参数,NULL

     DWORD                                 dwStackSize,                       //in,线程堆栈大小,0为取默认(1MB)

     LPTHREAD_START_ROUTINE  lpStartAddress,                   //in,线程函数 地址,

     LPVOID                                  lpParameter,                      //in,传给此线程参数

     DWORD                                 dwCreationFlags,               //in,取0一旦创建立刻执行,

                                                                                        //    取CREATE_SUSPENDED 挂起 (msdn)    

     LPDWORD                              lpThreadId                         //out,线程Id,

);

 

说明:lpTheradId (线程Id),是一个全局变量,独一无二标示系统任一进程中的某个线程,

                    AttachThreadInput()和PostThreadMessage()需要它,从而影响此线程的消息队列.

                    调试器,观察器也需要它

       返回HANDLE 是一个核心对象句柄 ,核心对象是系统拥有,它不属于任一程序,程序只能使用,

                     程序每打开一个核以对象,系统就会对此核心对象引用计数加1,

                     当CreateThread()调用后,线程本身运行使核心对象引用计数加1(结束时减1),

                             返回一个handle,又使核心对象加1(CloseHandle()减1),

                             所以CreateThread()调用成功,线程核心对象引用计数最少是2.

                     线程的handle,是指向"线程核心对象",而不是指向线程本身( 不好理解,呵呵,,,,)

       为了安全,不可能从一个线程Id那里,得到此线程的HANDLE.

 

 

 

BOOL CloseHandle(

     HANDLE    hObject         //己打开对象的 handle

);

 

说明: CloseHandle()  只能对核心对象的引数计数减1,并不能清除核心对象,

               核心对象的引用计数减少到0时,由系统清除,

               也就是说,程序不能清除核心对象,只能通过CloseHandle()使你的程序与核心对象"脱离".

你可能感兴趣的:(null,attributes)