当前位置: 首页 > news >正文

Windows网络自学的第一天:创建线程

CreateThread函数:

        该函数用于创建一个新的线程并在其上运行指定的函数,原型如下:

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

        第一个参数:
            指向SECURITY_ATTRIBUTES形态的结构的指针,表示线程内核对象的安全属性
                windows 98忽略该参数,windows NT中设为NULL表示使用默认安全属性

        第二个参数:
            初始该线程的堆栈大小,以字节为单位,默认为0即使用默认大小(1MB),在任何情况下,OS会动态延长堆栈大小

        第三个参数:
            是一个指向线程函数的指针。线程将从此函数的入口点开始执行。
            函数名称无限制,但必须是以下形式声明:
                DWORD WINAPI ThreadProc(PVOID pParam);

        第四个参数:
            传递给线程函数(第三个函数的参数)的参数,是一个指针类型。

        第五个参数:
            线程的创建标志,通常设置为0即可,可选参数如下:
                0(或CREATE_SUSPENDED):默认值,创建线程后立即执行线程函数。

                CREATE_SUSPENDED:创建线程后暂停线程的执行,需要通过ResumeThread激活线程。

                CREATE_DETACHED:创建一个分离的线程,不需要手动释放线程资源。

                STACK_SIZE_PARAM_IS_A_RESERVATION:将dwStackSize参数解释为堆栈的保留大小。

                CREATE_NEW_CONSOLE:创建一个新的控制台窗口,使线程在独立的控制台环境中运行。

                CREATE_UNICODE_ENVIRONMENT:使用Unicode字符集解析环境字符串。

        第六个参数:
            一个指向DWORD类型的指针,用于接收新线程的标识符(ID)
            将返回线程的ID号,传入NULL表示不需要返回该线程ID号
 

 下面是示例:

#include <iostream>
#include <windows.h> //调用windows API的头文件
using namespace std;//回调函数,格式固定
DWORD WINAPI ThreadProc(PVOID lp){//线程的主体//…………return 0;
};int main()
{CreateThread(NULL, 0, ThreadProc, NULL, 0, 0);return 0;
}

ThreadProc函数解释:

        该函数即线程入口,ThreadProc 和 lp一样, 名字随意, ThreadProc函数本身作为CreateThread函数的第三个参数,该函数参数由CreateThread函数的第四个参数传入

    DWORD的本质是 unsigned long
    PVOID的本质是 void*

 

注意:在多线程环境中,全局变量是所有线程共享的,这意味着多个线程可以同时访问和修改这些全局变量。因为线程是并发的,所以当一个线程在执行过程中修改了全局变量的值时,其他线程在访问同一全局变量时可能会读取到这个修改后的值。

如果一个线程使用new在堆上分配了内存,并在线程执行过程中释放了这块内存,那么其他线程在访问这块内存时可能会遇到悬挂指针(dangling pointer)或无效内存访问的问题

因此,在多线程编程中,对于共享的资源,包括全局变量和动态分配的内存(如new操作),必须非常小心。应该通过合适的同步机制(例如互斥锁、条件变量等)来确保多个线程对这些资源的安全访问。这样可以避免潜在的竞态条件和访问无效内存的问题。

在处理动态内存时,最好的做法是由创建它的线程负责释放内存,而不是在其他线程中释放。此外,可以使用智能指针(例如std::shared_ptrstd::unique_ptr)来管理动态内存,这样可以避免手动释放内存的问题。

相关文章:

Windows网络自学的第一天:创建线程

CreateThread函数&#xff1a; 该函数用于创建一个新的线程并在其上运行指定的函数&#xff0c;原型如下&#xff1a; HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID …...

正确的 Java 异常处理

我们来谈谈痛点吧。由于我的职责&#xff0c;我必须使用许多不同的服务&#xff08;进行编辑、进行代码审查......&#xff09;&#xff1b;不同的团队通常会编写所有这些服务&#xff0c;每当涉及到处理错误并从服务转发错误时&#xff0c;有时我的眼睛就会开始流泪。让我尝试…...

RTT(RT-Thread)时钟管理

目录 时钟管理 时钟节拍 RTT工程目录结构介绍 配置文件&#xff1a;rtconfig.h 获取系统节拍 获取系统节拍数函数 实例 定时器 RT_Thread定时器介绍 定时器源码分析&#xff08;了解即可&#xff09; rt_system_timer_init (硬件定时器初始化) rt_system_timer_thr…...

基础实验篇 | uORB消息读写与自定义实验(二)

导读 uORB是PX4/Pixhawk系统中非常重要且关键的模块之一&#xff0c;是用于无人机模块间通信的协议机制。本篇将详细介绍uORB并详细拆解uORB消息读写与自定义实验全流程&#xff08;二&#xff09;。 基础实验篇 | uORB消息读写与自定义实验(二) 01 RflySim平台的uORB消息读写…...

k8s pod数据存储Volumes

一、说在前面的话 在 Kubernetes 的 Deployment 中&#xff0c;您可以使用多种类型的 Volumes 来管理 Pod 中的数据。 作用是用来共享目录及配置&#xff0c;不用在每个pod里进行配置。 本文主要概述怎么使用HostPath、PersistentVolumeClaim、ConfigMap。 二、k8s有哪些Vol…...

ZYNQ在Petalinux系统下双网口同网段的实现

ZYNQ在Petalinux系统下双网口同网段的实现 1.开发环境 采用了赛灵思zynq xc7z100芯片&#xff0c;外部挂载了两个网口phy芯片&#xff08;marvell 88e1510&#xff09;&#xff0c;且两个网口phy芯片公用MDIO管脚&#xff0c;bd配置如下&#xff1a; 2.问题说明 忙去了&am…...

突破传统监测模式:业务状态监控HM的新思路 | 京东云技术团队

一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不再赘述。这里主要讲如何去补偿&#xff1f;补偿的方案哪些&#xff1f;这就…...

7-16 验证“哥德巴赫猜想” (20 分)

7-16 验证“哥德巴赫猜想” &#xff08;20 分) 数学领域著名的“哥德巴赫猜想”的大致意思是&#xff1a;任何一个大于2的偶数总能表示为两个素数之和。比如&#xff1a;24519&#xff0c;其中5和19都是素数。本实验的任务是设计一个程序&#xff0c;验证20亿以内的偶数都可以…...

GEE学习02 --设置Jupyter Notebook的打开路径

直接双击Jupyter Notebook 桌面图标运行时&#xff0c;打开的文件路径是默认的&#xff1a;C&#xff1a;\用户\用户名 如果使用python命令提示符打开jupyter notebook &#xff0c; 而我新建的GEE学习文件夹在另一个路径&#xff0c;可以直接修改默认的保存路径&#xff1a;…...

stm32与上位机电脑间最快的通信方式是什么?

对于小型多关节机械臂的控制电路设计&#xff0c;选择合适的通信方式可以提高MCU与上位机之间的实时性。以下是一些在STM32上常用的通信方式&#xff0c;你可以根据你的具体需求选择适合的&#xff1a; 串口通信&#xff08;UART&#xff09;&#xff1a;串口通信是一种常见的…...

pytorch学习——卷积神经网络——以LeNet为例

目录 一.什么是卷积&#xff1f; 二.卷积神经网络的组成 三.卷积网络基本元素介绍 3.1卷积 3.2填充和步幅 3.2.1填充&#xff08;Padding&#xff09; 填充是指在输入数据周围添加额外的边界值&#xff08;通常是零&#xff09;&#xff0c;以扩展输入的尺寸。填充可以在卷…...

stm32 mpu6050 cubemx DMP法读取角度

文章目录 前言一、相关文件二、cubemx配置三、代码变量初始化主循环 总结 前言 文件 记录使用dmp库来读取mpu6050的角度。 这是参考文件 参考1–主要参考 github参考 参考2 参考三 一、相关文件 相关文件在这里下载&#xff08;未填&#xff0c;不过可以在上面的git中下载&a…...

.Net6 Core Web API 配置 log4net + MySQL

目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…...

校园跑腿小程序运营攻略

作为一名校园跑腿小程序的运营者&#xff0c;你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中&#xff0c;我将为你提供一些关键的运营策略&#xff0c;帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…...

InfluxDB2如何求增量数据

需求 项目中需要接入电表设备&#xff0c;求用电量。 按天和设备统计用电量 按天统计用电量 统计总用电量 存在的问题 difference 函数可以求增量&#xff0c;但是以上计算均存在一个问题&#xff0c;比如xx设备有8.1号和8.2号的数据&#xff0c;我统计每天的用电量&#xf…...

Flink作业调度的9种状态

1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot&#xff0c;每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成&#xff0c;比如并行度为 n 的 MapFunction 和 并行度为 n 的…...

8、Kubernetes核心技术 - ConfigMap

目录 一、ConfigMap概述 二、ConfigMap创建 2.1、命令行方式创建 2.2、yaml 文件方式创建 三、ConfigMap查询 四、ConfigMap更新 4.1、kubectl edit方式 4.2、kubectl apply方式 五、ConfigMap使用 5.1、spec.env 【环境变量】 5.2、spec.envFrom 【环境变量】 5.3…...

音视频--DTMF信号发送及检测

参考资料 https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91https://www.cnblogs.com/lijingcheng/p/4454932.html 1. DTMF是什么 1.1 DTMF定义 双音多频信号&#xff08;英语&#xff1a;Dual-Tone Multi-Frequency&#xff0c;简称&#xff1a;DTMF&a…...

阿里云容器服务助力极氪荣获 FinOps 先锋实践者

作者&#xff1a;海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系&#xff0c;自 2013 年起历经十年发展&#xff0c;可信云服务评估体系已日臻成熟&#xff0c;成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…...

C++ 通过time.windows.com获取时间

C++ 通过time.windows.com获取时间 在C++中,你可以使用 <ctime>头文件中的 time()函数来获取当前的系统时间。然后,你可以使用 <ctime>头文件中的 localtime()函数将时间转换为本地时间,并从中获取小时、分钟和秒。 以下是一个示例代码,演示如何通过time.windo…...

m3u8视频在线提取,m3u8流网站获取m3u8地址教程

今天分享的就是一款名为超级厉害的安卓手机应用&#xff0c;支持下载等多种功能&#xff0c;至于效果是否像介绍那样震撼还得慢慢看了&#xff0c;对于这种下载工具用来下什么东西大家估计玩的比老夜都溜&#xff0c;至于怎么找怎么用是什么这种基础问题就懒得多说了&#xff0…...

抖音爬虫避坑实战:从基础requests到进阶DrissionPage,我的踩坑记录与完整代码分享

从requests到DrissionPage&#xff1a;抖音数据采集的进阶实战与避坑指南 第一次尝试用Python爬取抖音视频时&#xff0c;我天真地以为几行requests代码就能搞定。直到实际动手才发现&#xff0c;从接口参数构造到动态加载处理&#xff0c;处处都是坑。这篇文章记录了我从基础r…...

告别GUI:在Matlab命令行里优雅地处理GRACE RL06数据(附代码详解)

命令行驱动的GRACE RL06数据处理&#xff1a;Matlab高效工作流构建指南 在卫星重力测量领域&#xff0c;GRACE&#xff08;Gravity Recovery and Climate Experiment&#xff09;数据已成为研究地球质量变化不可或缺的资源。随着RL06数据版本的发布&#xff0c;其精度和可靠性进…...

如何利用AutoTrain Advanced实现模型可扩展性设计:应对业务增长的终极策略

如何利用AutoTrain Advanced实现模型可扩展性设计&#xff1a;应对业务增长的终极策略 【免费下载链接】autotrain-advanced &#x1f917; AutoTrain Advanced 项目地址: https://gitcode.com/gh_mirrors/au/autotrain-advanced AutoTrain Advanced是一款强大的自动化机…...

机器人嵌入式开发者的成长路径-技能体系构建

15.1 技能体系构建 15.1.1 机器人嵌入式开发者的知识图谱 机器人嵌入式开发是一个典型的交叉学科领域,其技能体系横跨计算机科学、电子工程、控制理论和机械工程等多个学科。对于立志于在这一领域深耕的开发者而言,构建系统化的知识体系是职业发展的基石,也是从“能用”到…...

Jenkins自动化部署:如何安全存储和使用npm的authToken(附最佳实践)

Jenkins自动化部署中npm authToken的安全管理实践 在持续集成与持续交付(CI/CD)的现代开发流程中&#xff0c;npm作为前端生态的核心包管理工具&#xff0c;其认证机制的安全管理已成为DevOps工程师必须掌握的关键技能。传统交互式登录方式在自动化环境中显得笨拙且脆弱&#…...

Go: Under The Hood 完全指南:从零开始深入理解 Go 语言源码架构

Go: Under The Hood 完全指南&#xff1a;从零开始深入理解 Go 语言源码架构 【免费下载链接】under-the-hood &#x1f4da; Go: Under The Hood | Go 语言原本 | https://golang.design/under-the-hood 项目地址: https://gitcode.com/gh_mirrors/un/under-the-hood G…...

从零开始:使用PyTorch 2.7镜像快速运行YOLO项目

从零开始&#xff1a;使用PyTorch 2.7镜像快速运行YOLO项目 1. 环境准备与快速部署 PyTorch 2.7镜像是一个开箱即用的深度学习环境&#xff0c;预装了PyTorch和CUDA工具包&#xff0c;能够直接调用GPU加速模型训练和推理。这个镜像特别适合想要快速上手计算机视觉项目的开发者…...

免费漫画翻译神器:3分钟搞定日漫汉化,小白也能变大神!

免费漫画翻译神器&#xff1a;3分钟搞定日漫汉化&#xff0c;小白也能变大神&#xff01; 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearn…...

北美面试生存指南:如何优雅应对“压力测试”与“强势发问”?

顺利通过了简历筛选和第一轮的基础技术面&#xff0c;你信心满满地进入了 Onsite&#xff08;现场/视频连线&#xff09;轮次。然而&#xff0c;你遇到的面试官却全程板着脸&#xff0c;不仅频繁打断你的发言&#xff0c;还对你简历上最引以为傲的项目提出尖锐质疑&#xff1a;…...