CreateThread

【勇芳软件工作室】汉化HomePreviousNext

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。使用GetThreadPrioritySetThreadPriority函数来获取和设置线程的优先级值。

当线程终止时,线程对象达到信号状态,满足在对象上等待的任何线程。

线程对象保留在系统中,直到线程已经终止,并且其所有句柄已通过调用CloseHandle关闭。

ExitProcessExitThreadCreateThreadCreateRemoteThread功能以及正在开始(由CreateProcess调用的结果))的进程在进程之间相互序列化。一次只能在地址空间中发生其中一个事件。这意味着以下限制:

*在进程启动和DLL初始化例程中,可以创建新的线程,但是直到进程的DLL初始化完成为止,才能开始执行。

一个进程中只有一个线程可以在一个DLL初始化或分离例程中。

* ExitProcess不返回,直到它们的DLL初始化或分离例程中没有线程。

使用C运行时库的函数的线程应使用启动线程endthread C运行时函数进行线程管理,而不是CreateThreadExitThread.当调用ExitThread时,不这样做会导致内存泄漏小。

也可以看看

CloseHandle, CreateProcess, CreateRemoteThread, ExitProcess, ExitThread, GetExitCodeThread, GetThreadPriority, ResumeThread, SetThreadPriority, SECURITY_ATTRIBUTES