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()使你的程序与核心对象"脱离".