创建在调用进程的虚拟地址空间内执行的线程。

若要创建在另一个进程的虚拟地址空间中运行的线程,请使用CreateRemoteThread函数。

句型

HANDLE CreateThread(
  [in, optional]  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  [in]            SIZE_T                  dwStackSize,
  [in]            LPTHREAD_START_ROUTINE  lpStartAddress,
  [in, optional]  __drv_aliasesMem LPVOID lpParameter,
  [in]            DWORD                   dwCreationFlags,
  [out, optional] LPDWORD                 lpThreadId
);

参数

in,optional

linux c pthread_CreateThread thread stack size_CreateThread function parameters

lpThreadAttributes

指向SECURITY_ATTRIBUTES结构的表针,该结构指定新线程的安全描述符redhat linux 下载,并确定子进程是否可以承继返回的句柄。假如lpThreadAttributes为NULL,则线程将获取默认的安全描述符,但是未能承继句柄。线程的默认安全描述符中的访问控制列表(ACL)来自创建者的主要令牌。

dwStackSize

堆栈的初始大小(以字节为单位)。系统将此值舍入到近来的页面。倘若此参数为零,则新线程使用可执行文件的默认大小。有关详尽信息,请参阅线程堆栈大小。

lpStartAddress

指向由线程执行的应用程序定义函数的表针。此表针表示线程的起始地址。有关线程函数的详尽信息,请参阅ThreadProc。

in,optional

lpParameter

指向要传递给线程的变量的表针。

dwCreationFlags

控制线程创建的标志。

价值意义

创建后,线程会立刻运行。

CREATE_SUSPENDED

0x00000004

线程以挂起状态创建,在调用ResumeThread函数之前不会运行。

STACK_SIZE_PARAM_IS_A_RESERVATION

0x00010000

dwStackSize参数指定堆栈的初始保留大小。若果未指定此标志,dwStackSize指定递交大小。

out,optional

lpThreadId

指向接收线程标示符的变量的表针。倘若此参数NULLlinux命令,则不返回线程标示符。

返回值

假如函数成功,则返回值是新线程的句柄。

假如函数失败linux c pthread,则返回值NULL。若要获取扩充的错误信息,请调用GetLastError。

请注意,虽然lpStartAddress指向数据、代码或难以访问,CreateThread也可能成功。假如线程运行时起始地址无效,则会发生异常,线程将中止。因为启动地址无效,线程中止作为线程进程的错误退出进行处理。此行为类似于CreateProcess的异步性质,虽然进程引用无效或缺乏动态链接库(DLL),也会创建该进程。

言论

CreateThread thread stack size_CreateThread function parameters_linux c pthread

进程可以创建的线程数受可用虚拟显存的限制。默认情况下,每位线程都有一兆字节的堆栈空间。为此,在没有/3GBboot.ini选项的情况下,未能在32位系统上创建2,048个或更多线程。假如减少默认堆栈大小linux c pthread,可以创建更多线程。并且,假如为每位处理器创建一个线程并生成应用程序维护上下文信息的恳求队列,则应用程序将具有更好的性能。在处理下一个队列中的恳求之前,线程将处理队列中的所有恳求。

使用THREAD_ALL_ACCESS访问权限创建新线程句柄。假如在创建线程时未提供安全描述符,则使用正在创建线程的进程的主令牌为新线程构造默认安全描述符。当调用方尝试使用OpenThread函数访问线程时,会依照此安全描述符评估调用方的有效令牌,以授予或拒绝访问。

在调用GetCurrentThread函数时,新创建的线程本身具有完全访问权限。

WindowsServer2003:线程对自身的访问权限是通过评估线程针对为线程构造的默认安全描述符创建的进程的主要令牌来估算的。假如在远程进程中创建了线程,则使用远程进程的主要令牌。因而,新创建的线程在调用getCurrentThread时,可能会增加对自身的访问权限。个别访问权限(包括THREAD_SET_THREAD_TOKEN和THREAD_GET_CONTEXT可能不存在,因而造成意外失败。因而,不建议在模拟其他用户时创建线程。

假如线程处于可运行状态(即未使用CREATE_SUSPENDED标志),则线程可以在CreateThread返回之前开始运行,尤其是在调用方收到创建的线程的句柄和标示符之前。

线程执行从lpStartAddress参数指定的函数开始。假如此函数返回,则DWORD返回值用于中止对ExitThread函数的隐式调用中的线程。使用GetExitCodeThread函数获取线程的返回值。

该线程是使用线程优先级THREAD_PRIORITY_NORMAL创建的。使用GetThreadPriority和SetThreadPriority函数获取和设置线程的优先级值。

当线程中止时,线程对象将达到讯号状态,满足正在等待对象的任何线程。

线程对象仍然保留在系统中,直至线程中止,但是通过调用关掉线程的所有句柄CloseHandle。

ExitProcess、ExitThread、CreateThread、CreateRemoteThread函数以及启动进程(由CreateProcess调用的结果)在进程中互相序列化。一次只能在地址空间中发生其中一个风波。这意味着存在以下限制:

调用C运行时库(CRT)的可执行文件中的线程应使用线程管理_beginthreadex和_endthreadex函数,而不是CreateThread和ExitThread;这须要使用CRT的多线程版本。假如使用CreateThread创建的线程调用CRT,CRT可能会在显存不足的情况下中止进程。

WindowsPhone8.1:WindowsPhone8.1及更高版本的WindowsPhone应用商店应用支持此功能。

Windows8.1和WindowsServer2012R2:Windows8.1、WindowsServer2012R2及更高版本中的Windows应用商店应用支持此函数。

反例

linux c pthread_CreateThread thread stack size_CreateThread function parameters

有关示例,请参阅创建线程。

要求要求价值

最低支持的顾客端

WindowsXP

桌面应用|UWP应用

支持的最低服务器

WindowsServer2003

桌面应用|UWP应用

目标平台

阳台

康泰时

processthreadsapi.h(包括WindowsServer2003、WindowsVista、Windows7、WindowsServer2008WindowsServer2008R2上的Windows.h)

Kernel32.lib;WindowsPhone8.1上的WindowsPhoneCore.lib

DLL

CreateThread function parameters_linux c pthread_CreateThread thread stack size

Kernel32.dll;WindowsPhone8.1上的KernelBase.dll

另请参阅

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

进程和线程函数

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复