[C++ 网络协议] Windows平台下的线程

目录

1.内核对象( Windows)

2. 创建线程( Windows)

3. 线程内核对象的两种状态

3.1 内核对象状态的查看


1.内核对象( Windows)

在介绍Windows的线程之前,先介绍下Windows的内核对象。

内核对象的概念:

如线程、进程、文件、信号量、互斥量等等,这些都是由操作系统所创建的资源,也统一由操作系统来管理,操作系统为了方便管理它们,就会在创建它们的同时,生成数据块(也可视为结构体变量),这个数据块以记录相关信息的方式来管理各种资源,被称为“内核对象”。

内核对象的归属:

线程、文件等资源的创建请求都在进程中执行,但不能认为此时创建的内核对象所有者就是进程。其实,可以通过内核对象的概念很容易得出,内核对象的所有者是内核,而内核就是操作系统。

总结:

内核对象就是为了管理线程、文件等资源而由操作系统创建的数据块,其创建者和所有者均为操作系统。

2. 创建线程( Windows)

方法一:

#include<windows.h>HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,    //线程安全相关信息,传NULL为默认设置
SIZE_T dwStackSize,                          //要分配给线程的栈大小,传0为默认大小
LPTHREAD_START_ROUTING lpStartAddress,       //传递线程的main函数信息
LPVOID lpParameter,                          //调用main函数传递的参数
DWORD dwCreationFlags,                       //指定线程创建后的行为,传0表示线程进入可执行状态
LPDWORD lpThreadId                           //保存线程ID的变量的地址
);
成功返回线程句柄
失败返回NULL

只需考虑lpStartAddress参数(线程main函数信息),以及lpParameter参数(调用main函数传递的参数)即可,因为其他的都传0或NULL,除了lpThreadId。

缺点:通过这个方式创建出来的线程里,在使用C/C++标准函数时,会不稳定。

方法二:(线程安全的标准C函数)

#include<process.h>uintptr_t _beginthreadex(
void* security,                        //线程安全相关信息,传NULL为默认设置
unsigned stack_size,                   //要分配给线程的栈大小,传0为默认大小
unsigned (* start_address)(void* ),    //传递线程的main函数信息
void* arglist,                         //调用main函数传递的参数
unsigned initflag,                     //指定线程创建后的行为,传0表示线程进入可执行状态
unsigned* thrdaddr                     //保存线程ID的变量的地址
);
);
成功返回线程句柄
失败返回0

_beginthread函数和_beginthreadex函数的区别:

前者会为了防止访问内核对象,让创建线程时返回的句柄失效。后者不会。

注意:方式二的线程的main函数,需要在函数名前加上WINAPI宏,其是Windows的固有关键字,用于指定参数传递方向,分配的栈返回方式等函数调用相关规定。如:

unsigned WINAPI ThreadFunc(void* arg)
{......
}int main()
{......HANDLE hTrread=(HANDLE)_beginthreadex(NULL,0,ThreadFunc,(void*)&param,0,&threadId);
}

句柄、内核对象、线程ID的关系:

句柄可以引用内核对象,所以可以通过句柄来区分内核对象,通过内核对象可以区分线程。所以线程句柄成为可以区分线程的工具。

那么线程句柄可以区分线程,那线程ID有什么用?

线程ID也是用来区分线程的,但是它们的区别是:句柄的整数值在不同进程中可能会出现重复,但线程ID在跨进程的范围内不会出现重复。

3. 线程内核对象的两种状态

一种是:signaled状态,表示线程已终止

一种是:non_signaled状态,表示线程未终止

操作系统会把这种状态信息保存到内核对象里,所有进程和线程的内核对象初始状态都是non_signaled,其通过1个boolean变量来表示,当为FALSE时,为non_signaled状态,当为TRUE时,为signaled状态。默认为FALSE,线程/进程结束,就会置为TRUE。这个状态不是一致的,内核对象类型不同,进入的状态的情况也不同。

3.1 内核对象状态的查看

单个内核对象状态的查看:

#include<windows.h>DWORD WaitForSingleObject(
HANDLE hHandle,            //查看状态的内核对象句柄
DWORD dwMilliseconds       //以1/1000秒为单位指定超时时间,传递INFINITE会阻塞住,//直到内核对象变为signaled状态
);
成功返回事件信息,事件信息:成功进入signaled状态返回WAIT_OBJECT_0,超时返回WAIT_TIMEOUT
失败返回WAIT_FAILED

该函数放回时,内核对象变为signaled状态,之后,有时会把相应内核对象又改为non-signaled状态。这种函数返回后自动切换回non-signaled状态的内核对象称为“auto-reset模式”的内核对象。反之,不会自动切换的内核对象就称为“manual-reset模式”的内核对象

多个内核对象状态的查看:

#include<windows.h>DWORD WaitForMultipleObjects(
DWORD nCount,                //验证的内核对象数
const HANDLE* lpHandles,     //存有内核对象句柄的数组地址值
BOOL bWaitAll,               //TRUE,则所有内核对象都变为signaled时返回//FALSE,则只要有一个验证对象的状态变为signaled时就返回
DWORD dwMilliseconds         //以1/1000秒为单位指定超时时间,传递INFINITE会阻塞住,//直到内核对象变为signaled状态
); 
成功返回事件信息,事件信息:成功进入signaled状态返回WAIT_OBJECT_0,超时返回WAIT_TIMEOUT
失败返回WAIT_FAILED

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

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

相关文章

springboot项目中定时任务注解@Scheduled未按cron表达式执行

springboot项目中定时任务注解Scheduled未按cron表达式执行 背景问题复现原因分析解决方法其他原因 背景 在将一个类注入到ioc后&#xff0c;其中定义了几个定时任务&#xff0c;分别是每隔十秒执行一次&#xff0c;但实际情况却是半小时才执行一次&#xff0c;故开始分析原因&…

爬虫怎么批量采集完成任务

目录 一、了解网络爬虫 二、Python与网络爬虫 三、批量采集任务的实现 1.确定采集网站及关键词 2.安装相关库 3.发送请求并获取响应 4.解析HTML文档 5.提取文章内容 6.保存文章内容 7.循环采集多篇文章 8.增加异常处理机制 9.优化代码性能 四、注意事项 总结 在当…

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后&#xff0c;建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面

virtualbox安装的linux虚拟机安装并启动Tomcat过程&#xff08;结合idea操作&#xff09;记录&#xff0c;并使用宿主机访问页面 参考教程地址linux版本Tomcat下载地址上传解压 启动TomcatVirtualBox虚拟机本地可访问宿主机尚未可以访问关闭防火墙宿主机可以访问 参考教程地址 …

vivado乘法器IP核进行无符号与有符号数相乘问题的验证

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性&#xff0c;其中也遇到了一些问题&#xff0c;做此记录。 配套工程&#xff1a;https://download.csdn.net/download/weixin_48412658/88354179 文章目录 问题的讨论验证过程IP核配置例化乘…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(五)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试 系统测试1. 训练准确率2. 测试效果3. 模型应用1&#xff09;程序下载运行2&#xff09;应用使用说明3&#xff09;测试结果 相关其它…

Spring源码相关

总分结构回答&#xff0c;突出关键接口、类、方法名 run -> AbstractApplicationContext.refresh&#xff08;&#xff09;程序的入口 在IOC中的操作都是基于DefaultListableBeanFactory bd对象保存在map集合中 refresh方法宝包括了整个Spring的执行流程和bean的完整生命…

企业做软文推广的三大错误有哪些?媒介盒子为您解答

软文营销已经成为企业宣传的主要方式&#xff0c;但有很多企业来找媒介盒子咨询&#xff0c;明明花了大量成本来做软文推广&#xff0c;为什么就是没效果呢&#xff1f;小编看了下&#xff0c;发现大部分企业做软文推广效果不明显&#xff0c;基本上犯了三大错误&#xff0c;接…

解决 react 项目启动端口冲突

报错信息&#xff1a; Emitted error event on Server instance at:at emitErrorNT (net.js:1358:8)at processTicksAndRejections (internal/process/task_queues.js:82:21) {code: EADDRINUSE,errno: -4091,syscall: listen,address: 0.0.0.0,port: 8070 }解决方法&#xff…

OpenLayers实战,OpenLayers调用手机陀螺仪方向实现指南针效果

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解OpenLayers如何使用手机陀螺仪实现指南针,除了需要调用陀螺仪外,还需要获取手机的实时位置。 通过获取到的实时位置显示箭头图标位置,通过获取陀螺仪水平方向来调整箭头指向。 注意:必须在https请求(带ssl证书)下才…

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍

一、引言 由于公司要求支持国产信创&#xff0c;最近办公的笔记本电脑换成了软硬件全国产&#xff0c;由于国产操作系统是在开源linux基础上演进的&#xff0c;在换之前&#xff0c;非常担心操作不方便&#xff0c;周边应用软件少&#xff0c;功能差&#xff0c;内心是比较抗拒…

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…

第77篇:美国APT入侵西北工业大学使用的5款远控后门揭秘

Part1 前言 大家好&#xff0c;我是ABC_123。在几个月前&#xff0c;我反复研读国家计算机病毒应急处理中心的多篇报告及360安全公司发布的各种关于该事件的报道&#xff0c;再结合国外对于美国APT研究报告&#xff0c;花了半个多月的时间复盘了美国APT入侵中国西北工业大学的…

红米note13 秒解锁BL 跳过168 秒解锁BL,红米Redmi Note 13 Pro+ 系列 无需等待168小时,刷入magisk教程 刷机包下载

最近入手了一台红米note13&#xff0c;发现需要等待168小时才能解锁BL&#xff0c;这让我感到非常困扰。不过&#xff0c;经过一番研究&#xff0c;我发现了一个秒解锁BL的方法&#xff0c;无需等待168小时&#xff0c;而且还可以刷入magisk&#xff0c;非常方便。 首先&#x…

[C++ 网络协议] I/O流分离所带来的半关闭问题

1.问题和解决方法 根据所学内容&#xff0c;I/O流分离现如今有如下2种方法&#xff1a; 1.调用进程fork函数&#xff0c;分离出子进程&#xff0c;主进程和子进程分别进行输入流的读和输出流的写。 2.用FILE指针按读模式和写模式将输入流和输出流进行区分。 第一种方法&#…

概率深度学习建模数据不确定性

https://zhuanlan.zhihu.com/p/568912284理解论文 What uncertainties do we need in Bayesian deep learning for computer vision? &#xff08;NeurIPS 2017) [1]中的数据不确定性建模&#xff0c;并给出公式推导。论文[1]指出不确定性uncertainty分为随机不确定性(aleator…

华为云云耀云服务器L实例评测|华为云上安装etcd

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上安装etcd一、什么是etcd官方硬件建议 二、华为云主机准备三、etcd安装1. 安装预构建的二进制文件2. 从源代码构建 四、etcd服务注册与发现1. 配置etcd2. 使用systemctl 管理启动etcd服务3. 注册服务4. 发现服务 五、其…

Spring Boot与Spring Security的跨域解决方案

目录 一、什么是跨域问题 二、Spring Boot和Spring Security介绍 三、如何解决Spring Boot与Spring Security的跨域问题 一、什么是跨域问题 跨域问题&#xff08;Cross-Origin Resource Sharing&#xff0c;简称CORS&#xff09;是指在Web开发中&#xff0c;浏览器出于安全…

【C++】C++11——构造、赋值使用条件和生成条件

移动构造和移动赋值生成条件移动构造和移动赋值调用逻辑强制生成默认函数的关键字default禁止生成默认函数的关键字delete 移动构造和移动赋值生成条件 C11中新增的移动构造函数和移动赋值函数的生成条件为&#xff1a; 移动构造函数的生成条件&#xff1a;没有自己实现的移动…