CreateThread函数创建一个在调用进程的地址空间内执行的线程。
手柄CreateThread(
LPSECURITY_ATTRIBUTES 【lpThreadAttributes】, | //指向线程安全属性的指针 |
DWORD 【dwStackSize】, | //初始线程堆栈大小,以字节为单位 |
LPTHREAD_START_ROUTINE 【lpStartAddress】, | //指向线程函数的指针 |
LPVOID 【lpParameter参数】, | //参数新线程 |
DWORD 【dwCreationFlags】, | //创建标志 |
LPDWORD 【lpThreadId】 | //指向返回的线程标识符 |
); |
参数
【lpThreadAttributes】
指向SECURITY_ATTRIBUTES结构的指针,用于确定返回的句柄是否可由子进程继承。如果【lpThreadAttributes】为NULL,则无法继承句柄。
Windows NT:结构的lpSecurityDescriptor成员指定新线程的安全描述符。如果【lpThreadAttributes】为NULL,线程将获得默认的安全描述符。
Windows 95:结构的lpSecurityDescriptor成员将被忽略。
【dwStackSize】
指定新线程的堆栈大小(以字节为单位)。如果指定为0,则堆栈大小默认为与进程主线程相同的大小。堆栈被自动分配到进程的内存空间中,当线程终止时它被释放。请注意,如有必要,堆栈大小会增长。
CreateThread尝试提交【dwStackSize】指定的字节数,如果大小超过可用内存,则会失败。
【lpStartAddress】
新线程的起始地址。这通常是使用WINAPI调用约定声明的函数的地址,该惯例接受单个32位指针作为参数,并返回一个32位退出代码。它的原型是:
DWORD WINAPI【ThreadFunc】( LPVOID );
【lpParameter参数】
指定传递给线程的单个32位参数值。
【dwCreationFlags】
指定控制线程创建的其他标志。如果指定了CREATE_SUSPENDED标志,线程将被创建为挂起状态,直到调用ResumeThread函数为止。如果此值为零,线程将在创建后立即运行。此时,不支持其他值。
【lpThreadId】
指向接收线程标识符的32位变量。
返回值
如果函数成功,则返回值是新线程的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
Windows 95: CreateThread只有在32位程序的上下文中被调用才能成功。当一个16位程序调用该DLL时,32位DLL不能创建一个额外的线程。
备注
新的线程句柄创建完全访问新线程。如果没有提供安全描述符,则可以在需要线程对象句柄的任何函数中使用句柄。当提供安全描述符时,在授予访问权限之前,对句柄的所有后续使用执行访问检查。如果访问检查拒绝访问,则请求进程不能使用句柄来访问线程。
线程执行从【lpStartAddress】参数指定的函数开始。如果此函数返回,则DWORD返回值用于在对ExitThread函数的隐式调用中终止线程。使用GetExitCodeThread函数来获取线程的返回值。
即使【lpStartAddress】指向数据,代码或无法访问,CreateThread功能也可能会成功。如果线程运行时起始地址无效,则发生异常,线程终止。由于无效的起始地址导致的线程终止被处理为线程进程的错误退出。这种行为类似于CreateProcess的异步性质,即使它引用了无效或缺少的动态链接库(DLL),该进程也被创建。
线程的线程优先级为THREAD_PRIORITY_NORMAL。使用GetThreadPriority和SetThreadPriority函数来获取和设置线程的优先级值。
当线程终止时,线程对象达到信号状态,满足在对象上等待的任何线程。
线程对象保留在系统中,直到线程已经终止,并且其所有句柄已通过调用CloseHandle关闭。
ExitProcess,ExitThread,CreateThread,CreateRemoteThread功能以及正在开始(由CreateProcess调用的结果))的进程在进程之间相互序列化。一次只能在地址空间中发生其中一个事件。这意味着以下限制:
*在进程启动和DLL初始化例程中,可以创建新的线程,但是直到进程的DLL初始化完成为止,才能开始执行。
一个进程中只有一个线程可以在一个DLL初始化或分离例程中。
* ExitProcess不返回,直到它们的DLL初始化或分离例程中没有线程。
使用C运行时库的函数的线程应使用启动线程和endthread C运行时函数进行线程管理,而不是CreateThread和ExitThread.当调用ExitThread时,不这样做会导致内存泄漏小。
也可以看看
CloseHandle, CreateProcess, CreateRemoteThread, ExitProcess, ExitThread, GetExitCodeThread, GetThreadPriority, ResumeThread, SetThreadPriority, SECURITY_ATTRIBUTES