首页 > 编程知识 正文

createevent函数(CreateThread函数)

时间:2023-05-04 18:55:25 阅读:121251 作者:2296

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

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

语法handle createthread (LP security _ attributeslpthreadattributes,SIZE_T dwStackSize,lpthread _ start _ rou rou rutinelpstart 参数http://指向www.Sina.com/security _ attributes结构的指针。 确定子进程是否可以继承返回的句柄。 如果lpThreadAttributes为NULL,则无法继承句柄。

结构的lpSecurityDescriptor成员指定新线程的安全描述符。 如果lpThreadAttributes为NULL,则线程获取默认安全描述符。 线程的默认安全描述符的ACL来自作者的主要标志。

lpThreadAttributes堆栈的初始大小。 字节单位。 此值将四舍五入到最近的页面。 如果此参数为零,则新线程将使用可执行文件的默认大小。 有关详细信息,请参阅线程堆栈大小。

指向由dwStackSize线程执行的APP应用程序定义函数的指针。 指针表示线程的开始地址。 有关线程函数的详细信息,请参见ThreadProc

指向要传递到lpStartAddress线程的变量的指针。

lpParameter控制课程创建徽标。

意义0线程在创建后立即执行。 CREATE_SUSPENDEDs0x00000004线程是在挂起状态下创建的,在调用ResumeThread函数之前不会运行。 stack _ size _ param _ is _ a _ reservation0x 00010000在上述dwStackSize参数中指定堆栈的初始保留大小。 如果未指定此标志,则dw堆栈大小指定提交大小。dwCreationFlags指向接收线程标识符的变量的指针。 如果此参数为NULL,则不返回线程标识符。

如果返回值函数成功,返回值将成为新线程的句柄。

如果函数失败,则返回值为空。 要获取扩展错误信息,请调用GetLastError。

请注意,即使lpStartAddress指向数据,并且代码或无法访问,CreateThread也可能成功。 如果执行线程时起始地址无效,则会发生异常,线程将终止。 由无效起始地址引起的线程终止被视为线程进程的错误终止。 此行为类似于CreateProcess的异步特性,即使禁用或缺少对动态链接库(dll )的引用,也会创建进程。

注释进程可以创建的线程数受可用虚拟内存的限制。 默认情况下,每个线程有1兆字节的堆栈空间。 因此,最多可以创建2,048个线程。 减小默认堆栈大小可以创建更多线程。 但是,通过为每个处理器创建线程、构建APP应用程序队列以及APP应用程序维护上下文信息,可以提高APP应用程序的性能。 线程在处理下一个队列中的请求之前,将处理队列中的所有请求。

使用THREAD_ALL_ACCESS权限创建新的线程句柄。 如果在创建线程时未指定安全描述符,请使用创建线程的进程的主令牌为新线程创建默认安全描述符。 如果调用方尝试使用OpenThread函数访问线程,则会根据此安全描述符评估调用方的有效令牌,以授予或拒绝访问权限。

调用GetCurrentThread函数时,新创建的线程可以完全访问自己。

lpThreadId线程对自身的访问权限是通过根据为线程构建的默认安全描述符评估创建线程的过程的主令牌来计算的。 如果要在远程进程中创建线程,请使用远程进程的主令牌。 因此,调用GetCurrentThread时,新创建的线程可能会减少对自身的访问。 由于不存在包括THREAD_SET_THREAD_TOKEN和THREAD_GET_CONTEXT在内的某些访问权限,因此可能会发生意外故障。 因此,建议在模仿其他用户时不要创建线程。

如果线程是在可执行状态下创建的,也就是说,如果未使用CREATE_SUSPENDED标志,则可以在返回CreateThread之前开始执行线程,特别是在它收到调用程序创建的线程的句柄和标识符之前。

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

创建的线程的优先级为THREAD_PRIORITY_NORMAL。 使用GetThreadP

riority和 SetThreadPriority函数来获取和设置线程的优先级值。

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

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

ExitProcess, ExitThread, CreateThread, CreateRemoteThread的功能,以及正在启动的处理(如通过一个调用的结果 CreateProcess)的过程中是彼此之间串行化。这些事件中只有一个可以一次发生在地址空间中。这意味着以下限制包含:

在进程启动和DLL初始化例程期间,可以创建新线程,但是在为进程执行DLL初始化之前它们不会开始执行。
进程中只有一个线程可以一次处于DLL初始化或分离例程中。
在DLL初始化或分离例程中没有线程之前,ExitProcess不会完成。
调用C运行时库(CRT)的可执行文件中的线程应使用_beginthreadex和_endthreadex函数进行线程管理,而不是 CreateThread和 ExitThread ; 这需要使用CRT的多线程版本。如果使用CreateThread创建的线程调用CRT,则CRT可以在低内存条件下终止进程。
Windows Phone 8.1: Windows Phone 8.1及更高版本上的Windows Phone应用商店支持此功能。

Windows 8.1和Windows Server 2012 R2:Windows 8.1,Windows Server 2012 R2及更高版本上的Windows应用商店应用程序支持此功能。

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。