CreateThread函数

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

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

语法

HANDLE CreateThread(LPSECURITY_ATTRIBUTES   lpThreadAttributes,SIZE_T                  dwStackSize,LPTHREAD_START_ROUTINE  lpStartAddress,__drv_aliasesMem LPVOID lpParameter,DWORD                   dwCreationFlags,LPDWORD                 lpThreadId
);

参数

  • lpThreadAttributes

指向SECURITY_ATTRIBUTES 结构的指针,该结构确定子进程是否可以继承返回的句柄。如果 lpThreadAttributesNULL,则无法继承句柄。

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

  • dwStackSize

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

  • lpStartAddress

指向由线程执行的应用程序定义函数的指针。该指针表示线程的起始地址。有关线程函数的更多信息,请参见 ThreadProc

  • lpParameter

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

  • dwCreationFlags

控制线程创建的标志。

含义
0该线程在创建后立即运行。
CREATE_SUSPENDEDs 0x00000004线程是在挂起状态下创建的,并且在调用ResumeThread函数之前不会运行 。
STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000在所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。

  • lpThreadId

指向接收线程标识符的变量的指针。如果此参数为 NULL,则不返回线程标识符。

返回值

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

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

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

备注

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

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

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

Windows Server 2003: 线程对自身的访问权限是通过根据为线程构造的默认安全描述符评估创建线程的进程的主令牌来计算的。如果在远程进程中创建线程,则使用远程进程的主令牌。因此,在调用GetCurrentThread时,新创建的线程可能会减少对自身的访问权限。某些访问权限(包括THREAD_SET_THREAD_TOKENTHREAD_GET_CONTEXT)可能不存在,从而导致意外故障。因此,建议不要在模仿其他用户时创建线程。

如果线程是在可运行状态下创建的(即,如果未使用CREATE_SUSPENDED标志),则线程可以在CreateThread返回之前开始运行,特别是在调用者接收到创建的线程的句柄和标识符之前。

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

创建的线程的线程优先级为THREAD_PRIORITY_NORMAL。使用 GetThreadPriority和 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应用商店应用程序支持此功能。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 的请求处理、请求的处理流程

nginx的请求处理 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 nginx使用一个多进程模型来对外提供服务,其中一个master进程,多个worker进程。master进程负责…

如何控制油门更准确?

学员问:平时练车还不错,可是一换车就容易加大油门,有什么方法能很好的控制油呢?? 如何控制油门更准确?和调的座位有关系吗?? 答:油门跟刹车被视为汽车控制的灵魂。汽车发…

使用线程——创建线程

CreateThread函数创建一个进程的新的线程。创建线程必须指定新线程要执行的代码的起始地址。通常,起始地址是程序代码中定义的函数的名称(有关更多信息,请参阅ThreadProc)。此函数采用单个参数并返回DWORD值。一个进程可以让多个线…

location

location (地址): 是浏览器 window 上的一个对象,不仅能处理当前页面的网络地址,还可以实现页面间的跳转 页面的跳转: 为什么使用它? 使我们也可以通过脚本语言,也能实现 a 链接,同样的效果&…

linux :Docker 方式 安装 zookeeper、阿里服务器上 Docker 运行 zookeeper

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 查找官方镜像,并下载镜像: # 搜索镜像: docker search zookeeper# 拉取镜像:docker …

使用线程池功能

此示例创建自定义线程池,创建工作项和线程池计时器,并将它们与清理组关联。该池由一个持久性线程组成。它演示了以下线程池函数的使用: CloseThreadpool CloseThreadpoolCleanupGroupCloseThreadpoolCleanupGroupMembersCloseThreadpoolWait…

制动刹车片六个养护要点

刹车片属于消耗品,在使用中会逐渐磨损,当磨损到极限位置时,必须更换,否则将降低制动的效果,甚至造成安全事故。 制动刹车片关乎生命安全,必须谨慎对待。 大多数轿车采用前盘后鼓式制动器结构,一…

Learn day4 函数参数\变量\闭包\递归

1.函数描述 # ### 函数 """ (1)函数的定义:功能 (包裹一部分代码 实现某一个功能 达成某一个目的) (2)函数特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理 """# (3) 函数的基本格式 """ # 函数的定义处 def fun…

Java 中去除字符串中空格的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1、方法分类 str.trim(); //去掉首尾空格str.replace(" ",""); //去除所有空格,包括首尾、中间str.re…

使用重定向的输入和输出创建子进程

本主题中的示例演示如何使用控制台进程中的CreateProcess函数创建子进程。它还演示了一种使用匿名管道重定向子进程的标准输入和输出句柄的技术。请注意,命名管道也可用于重定向进程I / O. 所述CreatePipe函数使用SECURITY_ATTRIBUTES结构来创建可继承句柄读写两个…

手动挡停车时挂档有技巧

徐小姐来电:我家的汽车要年检了,前几天,工作人员帮我把车子开进检测站去检测,开回来后停在原位上,然后把钥匙交给我。我拿钥匙一点火,车子就突然往前动了,根本没有时间反应,已经撞到…

LOJ 3156: 「NOI2019」回家路线

题目传送门&#xff1a;LOJ #3156。 题意简述&#xff1a; 有一张 \(n\) 个点 \(m\) 条边的有向图&#xff0c;边有两个权值 \(p_i\) 和 \(q_i\)&#xff08;\(p_i<q_i\)&#xff09;表示若 \(p_i\) 时刻在这条边的起点&#xff0c;则 \(q_i\) 时刻能到达这条边的终点。 你需…

线程池概述

线程池 一个线程池的工作线程代表应用程序的高效执行异步回调的集合。线程池主要用于减少应用程序线程的数量并提供工作线程的管理。应用程序可以对工作项进行排队&#xff0c;将工作与可等待的句柄相关联&#xff0c;根据计时器自动排队&#xff0c;并与I / O绑定。 线程池架…

WEB 请求处理二:Nginx 请求 反向代理

上一篇《WEB请求处理一&#xff1a;浏览器请求发起处理》&#xff0c;我们讲述了浏览器端请求发起过程&#xff0c;通过DNS域名解析服务器IP&#xff0c;并建立TCP连接&#xff0c;发送HTTP请求。本文将讲述请求到达反向代理服务器的一个处理过程&#xff0c;比如&#xff1a;在…

方向盘的正确驾驭方法

如果问您油门踏板和方向盘哪个与驾驶员最“亲密”&#xff0c;您会选择谁呢&#xff1f;恐怕还是方向盘吧。如果汽车行驶过程中您的双手同时离开了方向盘&#xff0c;那么事故的隐患也就随之而来。下面我们就为您全面介绍汽车方向盘的正确使用方法。专家介绍&#xff0c;握方向…

SQL server 2005中无法新建作业(Job)的问题

客户端是使用企业管理其&#xff08;Management Studio&#xff09;新建job&#xff0c;总是无法创建&#xff0c;查找了很多资料&#xff0c;有的说是需要sp2, 但有的又说不是... ... 没有时间去研究为什么&#xff0c;但确有一种方法解决&#xff1a;到服务器端去创建job&…

线程池API

线程池API 线程池应用程序编程接口&#xff08;API&#xff09;使用基于对象的设计。以下每个对象都由用户模式数据结构表示&#xff1a; 池对象是一组可用于执行工作的工作线程。每个进程可以根据需要创建具有不同特征的多个隔离池。每个进程都有一个默认池。清理组与一组回…

WEB 请求处理 一:浏览器 请求发起处理

最近&#xff0c;终于要把《WEB请求处理系列》提上日程了&#xff0c;一直答应小伙伴们给分享一套完整的WEB请求处理流程&#xff1a;从浏览器、Nginx、Servlet容器&#xff0c;最终到应用程序WEB请求的一个处理流程&#xff0c;前段时间由于其他工作事情的安排&#xff0c;一直…

离合器半联动探秘

离合器踏板作用是切断发动机和变速箱之间的动力&#xff0c;有利于起步、变速、和停车。那么如何更好的使用它呢&#xff1f; 离合器的五种状态示意图 离合器半联动的使用方法揭密如下&#xff1a; 离合器半联动的使用探密之一 将离合器抬到车开始动时你就别再抬了&#xff0c;…

Biztalk Server 2006安装配置

前段时间收到了来自beta.microsoft.com的BTS20006 Beta2的下载地址&#xff0c;这两天对它进行了一番安装配置。下面把一些经过和步骤和大家分享一下&#xff0c;手中有一些去年的Biztalk Server2004版本的培训资料&#xff0c;里面有11个Lab。需要的朋友请留下mail&#xff0c…