VS C++ 线程篇之一创建线程

2023-11-03

创建线程

创建线程方法一、

HANDLE WINAPI CreateThread(

  LPSECURITY_ATTRIBUTES lpThreadAttributes,       // 线程安全属性
  SIZE_T dwStackSize,                                                // 线程堆栈大小
  LPTHREAD_START_ROUTINE lpStartAddress,         // 线程函数地址
  LPVOID lpParameter,                                              // 线程函数参数
  DWORD dwCreationFlags,                                      // 指定线程是否立即启动
  LPDWORD lpThreadId                                            // 存储线程ID号
);

        线程内核对象就是一个包含了线程状态信息的数据结构。每次对CreateThread 的成功调用,系统都会在内部为其分配一个内核对象。
        线程上下文反应了线程上次执行的寄存器状态,来保证线程之间切换(即还原现场)。
        计数器,调用一次OpenThread(CreateThread ),计数器加1,CloseThread(CloseHandle)计数器减一。当计数器值为0时,没有线程使用该内核对象,系统收回内存。计数器的初始值是2(主线程是1,创建的线程是2)。

创建线程方法二、C++底部的,并不是Windows标准API,创建线程函数,该函底层调用CreateThread。

#include <process.h>
uintptr_t _beginthreadex( 
   void *security,		// 线程安全属性
   unsigned stack_size,  // 线程堆栈大小
   unsigned ( *start_address )( void * ),  //线程函数地址
   void *arglist,  //传递给线程函数的参数
   unsigned initflag, // 指定线程是否立即启动
   unsigned *thrdaddr  // 存储线程ID号
);

安全属性

typedef struct _SECURITY_ATTRIBUTES {  

	DWORD nLength;  
	LPVOID lpSecurityDescriptor;  
	BOOL bInheritHandle;                //设置该句柄可以继承
} SECURITY_ATTRIBUTES,  
  *PSECURITY_ATTRIBUTES,  
  *LPSECURITY_ATTRIBUTES;

线程终止

    线程函数退出。

        线程使用的堆栈被释放。
        dwExitCode设置为线程函数的返回值。
        递减内核中的code值,让内核的引用计数减一。

// 结束线程调用,终止自己
VOID WINAPI ExitThread(
  __in DWORD dwExitCode	  // 线程结束时的退出码
);
// 由当前线程终止其他线程
BOOL WINAPI TerminateThread(
  __in_out HANDLE hThread,  // 终止的线程句柄
  __in DWORD dwExitCode     // 退出码
);
// 进程退出
VOID WINAPI ExitProcess(
  __in UINT uExitCode   // 退出码
);
void _endthreadex( 
   unsigned retval     // 退出码 
);

例程1:

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>


DWORD WINAPI ThreadProFunc(LPVOID lpParam);

int main(int argc, char **argv)
{
	HANDLE hThread;
	DWORD dwThreadId;
	
	hThread = CreateThread( NULL	// 默认安全属性
						, NULL		// 默认堆栈大小
						, ThreadProFunc // 线程入口地址
						, NULL	//传递给线程函数的参数
						, 0		// 指定线程立即运行
						, &dwThreadId	//线程ID号
						);

	for(int i = 0; i < 4; i++) {
		printf("nihao\n");
	}

	CloseHandle(hThread);	//关闭线程句柄,内核引用计数减一

	system("pause");
	return 0;
}

DWORD WINAPI ThreadProFunc(LPVOID lpParam)
{
	for(int i = 0; i < 4; i++) {
		printf("hello\n");
	}
	return 0;
}

运行结果:

nihao
hello
hello
nihao
hello
nihao
nihao
hello
请按任意键继续. . .


例程2:

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>

unsigned int WINAPI ThreadProFunc(void *pParam);

int main(int argc, char **argv)
{
	HANDLE hThread;
	unsigned int threadId;

	hThread = (HANDLE)_beginthreadex(NULL, NULL, ThreadProFunc,NULL, 0, &threadId); 

	for(int i = 0; i < 4; i++) {
		printf("nihao\n");
	}

	CloseHandle(hThread);	//关闭线程句柄

	system("pause");
	return 0;
}

unsigned int WINAPI ThreadProFunc(void *pParam)
{
	for(int i = 0; i < 4; i++) {
		printf("hello\n");
	}
	return 0;
}

运行结果

nihao
hello
hello
nihao
hello
nihao
nihao
hello
请按任意键继续. . .


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS C++ 线程篇之一创建线程 的相关文章

  • VS工作目录,输出目录

    默认情况下 输出目录 和 输出文件 两个属性对应的目录是一样的 这样用着方便 当然 输出文件的值在输出目录的值的基础上还包含有exe文件名 如果两个不一样 则中间生成的链接器用的如xx ilk和xx pdb文件等在输出目录 而最终生成的xx
  • Qt Qt5NetWork.lib Qthttp的get、post请求都无法响应解决方法(丧心病狂)

    qt项目中 get post请求都无法响应 抓包发现也并没有发出请求 程序也编写通过 什么原因就是找不到 最终发现 在新建Qt Gui application的时候 如果后续要做post和get请求 一定要选上NetWork NetWork
  • 【unity】VS没有代码补全问题

    1 运行Visual Studio Installer 安装插件 2 打开unity项目 进入Package Manager 安装插件 3 打开Preferences窗口 修改External Scripts Editor为你的vs编辑器
  • 头文件包含顺序不当引起错误

    昨天在写bug 不是 代码时 在编译的时候出现了 非法标记 与 语法错误 的报错 而且报错位置是一个不知道在哪个角落的文件 这种其他文件里的错误总是出现的莫名其妙 而且又是编译错误 调试也没法调试 看的脑壳疼 我起初以为是代码里的问题 于是
  • C++项目的报错经历及解决之法

    以下是自己在平时创建C 项目遇到的一些问题 记录在此 2021年4月13日 问题集锦 编译环境是VS2019 新建一个C 空项目 1 无法打开头文件xxx h 注 此处的头文件是我通过 添加现有项 所加入项目的 include
  • c++ 获取磁盘总大小

    float WindowsInfo GetDiskTotal 单位 G all Total 0 函数外自定义 all Free 0 DWORD dwSize MAX PATH TCHAR szLogicalDrives MAX PATH 0
  • VS 关于头文件和库文件的添加

    关于头文件和库文件的添加 一直没有很清晰的认识 下面是从网上搜索到的 自己总结的 也有一些不是很明白的 希望后续能够解决完善 也希望大神们能答疑解惑 一 头文件的添加比较清楚 一般就是 方法一 将所包含的头文件复制到当前目录 下 这个比较有
  • opencv基础-环境配置&官方文档&源码编译

    opencv环境配置 官方文档 源码编译 前言 一 官方下载网址 二 官方文档地址 三 安装教程 1 包下载 2 环境配置 1 为什么要配置环境 2 环境变量 3 系统环境 四 配置vs工程环境 vs2019 opencv4 6 0 1 v
  • VS中新建Qt项目工程后显示无法打开源文件“QtWidgets/QApplication”的解决方案

    1 环境 VS2015 Qt 5 6 2 现象描述 在vs中新建工程后一般都会显示无法打开源文件 QtWidgets QApplication 就像这样 3 原因 新建Qt项目时VC 包含目录没有自动包含Qt所需要的头文件路径 需要手动添加
  • Unity3d开发中,用Visual Studio编写c#脚本代码出现无法代码补全的解决方案

    VS版本 Visual Stduio 2017 第一步 VS菜单栏 gt 工具 gt 获取工具和功能 gt 打开visual studio installer 如下图勾选unity工作负载后安装 第二步 Unity菜单栏 gt edit g
  • VS2008 常用快捷键

    VS2008常用快捷键 1 怎样调整代码排版的格式 选择 编辑 gt 高级 gt 设置文档的格式 或 编辑 gt 高级 gt 设置选中代码的格式 格式化cs代码 自动对齐 Ctrl k f 格式化aspx代码 Ctrl k d 2 怎样跳转
  • 【目的:windows下VS2017/2022配置使用opengl - 初探-创建一个空窗口】

    目的 windows下VS2017 2022配置使用opengl 初探 创建一个空窗口 环境 系统 Win10 环境 VS2017 64bit 步骤 windows下visualstudio下使用opengl 搭建配置环境并测试窗口 1 o
  • 【Visual Studio】调试过程中VS卡死无响应

    最近在使用vs2022 debug调试过程中 经常出现vs2022直接卡死无响应 解决方案 第一种原因 是加载符号导致 调试 选项 符号 1 取消勾选 xxx 符号服务器 2 选择 仅加载指定的模块 第二种情况 VS卡死后 把崩溃dmp导出
  • 在VS中使用命令行参数

    在VS工具中 若要运行带有命令行参数的程序 有两种方法 方法一 在命令提示符中输入要运行的exe的文件名和要输入的参数 各参数之间用空格隔开 如exe文件为test exe 则输入 test 参数1 参数2 参数n 注意 exe文件应放在C
  • 关于QT5.12.0在VS2019上使用的细节

    关于QT5 12 0在VS2019上的使用细节 博主使用的版本 QT5 12 0 VS2019 其他Qt版本同样适用 1 添加Qt的环境变量 在Win10下 编辑系统环境变量 环境变量 Path 新建添加Qt的bin目录路径 D QT 12
  • VS下Qt的信号与槽实现

    实现主窗口中Add按钮的功能 这一部分要特别注意 除了实现功能代码外 还需自己手动添加一些其他的代码 Qt Creator可以自动添加 我们需要在2个地方添加代码 第1个是在addressbook h文件下添加一个槽函数声明 即属于priv
  • VS2022·初尝试评测(非专业测评)

    阅文时长 0 59分钟 字数统计 956 8字符 主要内容 1 引言 背景 2 载入界面 UI图标等细节 3 加载项目时间对比 4 编译项目时间对比 5 声明与参考资料 VS2022 初尝试评测 非专业测评 编写人 SCscHero
  • vs2017 15.5.x dll调试不成功问题

    配置 Unity5 5 5f1 vs2017 问题 更新到vs2017 15 5 0之后 项目中用到的dll调试断点进不去了 之后更新到15 5 1 依然进不去 现象 Unity工程下生成的dll文件只有dll pdb没有dll mdb文件
  • WIN10+VS2013+CUDA10安装方法

    1 先安装VS 先安装VS 先安装VS 安装CUDA会配置VS文件 反向的话VS中找不到文件 VS安装参考 https blog csdn net m0 37477061 article details 83447773 2 安装CUDA
  • 改用DirectShow+Opencv解决外置单USB接口的双目摄像头调用cv::VideoCapture打不开的问题

    最近在做windows人脸识别的项目中遇到一个很纳闷的问题 采用OpenCv库的VideoCapture打不开外置单USB双目摄像头 其他的只要是一个摄像头一跟USB就可以打开 在网上找了很多资料 七七八八的最终得以解决了 在这整理下 环境

随机推荐

  • 网安面试题

    导航小助手 如何识别CDN 如何判断靶标站点是windows linux 常见端口 同源策略 TCP和UDP区别 TCP协议的长连接和短连接 SYN FLOOD攻击和CC攻击 Mysql的网站注入 5 0以上和5 0以下的区别 sql注入读
  • 哈希算法(hash)加密解密

    一 哈希算法 hash 加密解密介绍 哈希 英文叫做 hash 哈希函数 hash function 可以把 任意长度的数据 字节串 计算出一个为固定长度的结果数据 我们习惯把 要计算 的数据称之为 源数据 计算后的结果数据称之为 哈希值
  • Redis的geospatial(地理位置)类型的用法

    Redis的geospatial 地理位置 类型的用法 说明 像微信中朋友的定位 附近的人 打车距离等 可以使用Geo在3 2版本之后推出 可以推算地理位置的信息 两地之间的距离 周围的人 底层是Zset 命令同样适用 常用命令 添加 ge
  • 用visio制作机柜服务器,ibm visio 服务器机柜图标

    实例简介 ibm visio 服务器机柜图标 ibm全系列产品visio机柜图标 画机柜平面图的选择 实例截图 核心代码 af108d07 08fb 4638 bf08 372416c35cd2 IBM IBM 1 vss IBM 2 vs
  • 华为手机日历倒计时_华为手机日历怎么设置生日和纪念日提醒?敬业签支持多方式提醒...

    我们在日常生活中除了每天普通的日子外 还有一些对于我们个人来说比较特殊的 有意义的日子 例如亲朋好友的生日 恋爱纪念日 结婚纪念日 以及每月初一十五去上香等 我们将要在一些固定的日期去做指定的事情 如果到时间遗忘做某事 将会造成或大或小的影
  • PID算法控制小车转向

    1 平衡小车转向控制调试 角加速度传感器线加速度计 直立静止时 x和y轴输出为0 z轴为g 存在一定角度时 g会在x和y轴存在分量 Angle Y表示角度 弧度制 Accel X表示重力加速度在x轴的分量 1 平衡小车转向环使用P 比例控制
  • C++:内联函数的优缺点

    内联函数 首先我们阐述一下函数 先从汇编语言的角度看函数的调用 其实就是call和ret的搭配实现了一个函数调用 用下面代码来解释 assume cs code code segment s nop ret main call s mov
  • Android中多USB摄像头解决方案——UVCCamera

    先贴上采用的开源库链接 https github com saki4510t UVCCamera https github com saki4510t OpenCVwithUVC 给USBCamera添加了OpenCV 业余时间捣鼓了下An
  • 支付宝自定义tabbar和小红点及解决bug

    须知 支付宝自定义tabbar 以 我的 界面为例 我有5个tabbar 所以 我的 界面就为第4个 有数字4 的地方换为你对应的tabbar序号 首次运行时 小红点allRedDot会出错 建议将有关allRedDot的地方都先注释 根据
  • 认识NR(四):全网最全最详细5G TypeII 和 Enhanced TypeII码本讲解

    声明 以下内容节选自本人组会ppt 仅供分享 禁止转载 一
  • 使用matlab内存不足,Matlab内存不足问题(Out of memory)

    今天遇到过这个错误 Error using gt horzcat Out of memory Type HELP MEMORY for your options 做算法仿真时 矩阵太大 超出内存了 当信号矩阵缩到可以满足内存时 仿真也没意义
  • discuz知识总结

    Discuz 系统常用函数及变量 常用函数 showmessage 函数 该函数就是我们最常见的页面提示跳转 比如登陆 退出 个人信息修改提交等等 效果演示 函数原型 showmessage message url forward extr
  • VUE搭建项目,配置本地IP地址其他人可访问项目

    1 首先找到config文件夹目录下的 index js文件 Various Dev Server settings host localhost 将localhost进行替换成 0 0 0 0 host 0 0 0 0 can be ov
  • STM32串口结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据、DMA

    参考 串口的结构体 重定向printf串口发送stm32等博文 作者 点灯小哥 发布时间 2021 03 06 21 46 33 网址 https blog csdn net weixin 46016743 article details
  • 手机快充方案

    一 各家快充方案及演进 1 高通的QiuckCharge快充 提升电压 发热严重 QC1 0 microUSB接口 5V充电环路阻抗0 32 最大充电电流为 5 4 2 0 32 2 5A 线材限制2A 功率限制10W QC2 0 Micr
  • JavaScript、Lua语言基础、电脑脚本、手机免ROOT免越狱脚本开发免费视频教程

    JavaScript基础教程 https www bilibili com video BV1YW411T7GX Lua基础教程 https www bilibili com video BV1tf4y1V747 一 EasyClick免R
  • Java 自定义比较器

    Comparator 和 Comparable 相同点 Comparator 和 Comparable都是java的接口 并且是用来对自定义的class比较大小的 对于自定义类如 public class Person String nam
  • USB通讯设置

    PMAC的USB通讯设置方法 日期 2015 06 08 作者 Z K 修订信息 2015 08 13修改1 1 PMAC示意图 2 PMAC与拓展板及接口板的连接 最下层是PMAC卡 上面连接ACC 1P 4扩展板 这个板子扩展四个轴 输
  • ES聚合分析

    前言 01 ES聚合类型 02 aggregations的语法结构 在学习之前 先掌握aggregations的语法结构 注意aggregations关键字可使用aggs代替 一 聚合起步 为了更加深刻的理解DSL聚合语法 这里是一个完整的
  • VS C++ 线程篇之一创建线程

    创建线程 创建线程方法一 HANDLE WINAPI CreateThread LPSECURITY ATTRIBUTES lpThreadAttributes 线程安全属性 SIZE T dwStackSize 线程堆栈大小 LPTHRE