Win32和c++11多线程
Win32和c++11多线程
- 一、概念
- 1.线程的特点
- 线程内核对象
- 线程控制块
- 线程是独立调度和分派的基本单位
- 共享进程的资源
- 2.线程的上下文切换
- 引起上下文切换的原因
- 3.线程的状态
- 二、Windows多线程API
- 1.CreateThread创建线程
- 2.获取线程ID
- 3.关闭线程句柄
- 4.挂起线程
- 5.恢复线程
- 6.休眠线程的执行
- 7.WaitForSingleObject
- 8.终止线程
- 9.获取线程结束码
- 10.WaitForMultipleObjects
- 11.\_beginthread和\_endthread
- CreateThread不安全
- _beginthread
- _endthread
- 三、多线程模拟火车站售票
- 1.介绍
- 2.实现
- 3.为什么会出现卖出了第0张票?
- 四、多线程之间的同步和互斥
- 1.临界区
- 临界区结构对象
- 初始化临界区
- 进入和离开临界区
- 尝试进入临界区
- 区别
- 删除临界区
- 2.线程死锁
- 死锁产生的必要条件
- 3.信号量
- 临界区与信号量对比
- 相关API
- (1)创建信号量
- (2)P操作
- (3)V操作
- 实现进程或线程只有一个实例
- 4.互斥量mutex
- 相关API
- (1)创建互斥量
- (2)获得互斥量
- (3)释放互斥量
- 示例
- 利用互斥量实现进程只有一个实例
- 5.事件Event
- 有信号状态和无信号状态
- 相关API
- (1)创建事件
- (2)把指定的事件对象设置为有信号状态
- (3)把指定的事件对象设置为无信号状态
- (4)等待事件对象的句柄
- 自动重置事件
- 手动重置事件
- 实现进程只有一个实例
- 6.PV操作
- 生产者消费者问题
- 7.总结
- 五、线程本地存储
- 1.静态TLS
- 2.动态TLS
- 六、多线程间的消息通讯
- 示例:一个线程向另一个线程发送消息
- 七、C++11多线程
一、概念
进程要想执行任务,必须得有线程,线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。
1.线程的特点
线程内核对象

线程控制块

线程是独立调度和分派的基本单位

共享进程的资源

2.线程的上下文切换

引起上下文切换的原因

3.线程的状态

二、Windows多线程API
头文件#include<Windows.h>
1.CreateThread创建线程


参数说明:






线程的句柄是一块地址,线程ID可以用GetCurrentThreadId()函数获得。
2.获取线程ID

3.关闭线程句柄

关闭句柄后线程还会继续执行。

4.挂起线程
5.恢复线程
6.休眠线程的执行




7.WaitForSingleObject
等待一个内核对象变为已通知状态。这个函数常用于线程同步,确保一个线程在继续执行之前等待某个事件(如线程结束、互斥体释放、信号量达到等)。


未通知状态:该句柄关联的线程未结束,仍在执行。
已通知状态:该句柄关联的线程执行结束。
参数:
hHandle:等待的对象的句柄。这个句柄可以是各种同步对象,如事件、互斥体、信号量、进程或线程。dwMilliseconds:超时时间,以毫秒为单位。如果设置为INFINITE,表示无限等待,直到对象进入信号状态。
返回值:
WaitForSingleObject 返回一个 DWORD 值,表示函数的结果。常见的返回值包括:
WAIT_OBJECT_0:指定的对象已进入信号状态。WAIT_TIMEOUT:等待超时,指定的对象在超时时间内未进入信号状态。WAIT_FAILED:函数调用失败。可以通过调用GetLastError函数获取扩展错误信息。


8.终止线程



9.获取线程结束码



10.WaitForMultipleObjects

参数说明:






11._beginthread和_endthread
CreateThread不安全



_beginthread

参数说明:

返回值:


_endthread


三、多线程模拟火车站售票
1.介绍

2.实现

3.为什么会出现卖出了第0张票?

四、多线程之间的同步和互斥


1.临界区

临界区结构对象


初始化临界区


进入和离开临界区


如果这样加锁,那么只要有一个线程进入临界区,除非所有票卖完,否则不会释放临界区。

如果这样加锁,又会出现卖出第0张票的情况。

最后这种情况,修改代码,在进入临界区后再次判断,可以避免上述情况。
尝试进入临界区


区别

删除临界区

2.线程死锁
死锁产生的必要条件


3.信号量
临界区与信号量对比

-
临界区
-
用于保护共享资源的代码块,确保在同一时间只有一个线程能够执行该代码块。
-
通常用于同一进程内的线程同步。
-
-
信号量
-
是一种更通用的同步机制,允许多个线程同时访问一定数量的共享资源。
-
可以用于进程间同步(IPC)。
-



相关API
(1)创建信号量

(2)P操作

(3)V操作




实现进程或线程只有一个实例

虽然每个进程有自己的地址空间,但命名对象(如命名信号量、命名互斥体等)是在系统范围内共享的。这意味着即使进程有各自的地址空间,命名对象在创建时会注册在操作系统的命名空间中,其他进程可以通过同样的名字访问这些对象。
在 Windows 操作系统中,命名对象(包括信号量、互斥体、事件等)在系统命名空间中共享。也就是说,当一个进程创建一个命名信号量时,操作系统会将该信号量注册在全局命名空间中。其他进程如果尝试创建或打开同名的信号量,就可以访问到这个信号量。


4.互斥量mutex

相关API
(1)创建互斥量

bInitialOwner:指定调用线程是否在互斥对象的初始状态下获得所有权。如果这个值为 TRUE,调用线程在互斥对象创建成功后立即获得所有权;否则,互斥对象的初始状态为非信号状态。
(2)获得互斥量

(3)释放互斥量

示例

利用互斥量实现进程只有一个实例

5.事件Event

有信号状态和无信号状态
在 Windows 操作系统中,事件对象用于线程同步,其状态可以是“有信号”(signaled)或“无信号”(nonsignaled)。这两种状态用于控制线程的执行,具体如下:
- 当事件对象处于有信号状态时,所有等待该事件的线程都将被解除阻塞,并继续执行。这意味着事件发生了,等待的线程可以继续进行它们的工作。
- 当事件对象处于无信号状态时,所有等待该事件的线程都将被阻塞,直到事件对象的状态变为有信号。这意味着事件尚未发生,等待的线程需要等待,直到事件发生。
事件对象可以分为两种类型:自动重置事件(auto-reset event)和手动重置事件(manual-reset event)。这两种类型的事件对象在状态变更和重置机制上有所不同。
- 当事件对象处于有信号状态时,等待的线程将被解除阻塞,然后事件对象自动重置为无信号状态。如果有多个线程在等待事件,只有一个线程会被解除阻塞。
- 当事件对象处于有信号状态时,所有等待的线程将被解除阻塞,并且事件对象保持有信号状态,直到显式调用
ResetEvent函数将其状态重置为无信号状态。
相关API
(1)创建事件



(2)把指定的事件对象设置为有信号状态

(3)把指定的事件对象设置为无信号状态

(4)等待事件对象的句柄

自动重置事件


手动重置事件


实现进程只有一个实例

6.PV操作



生产者消费者问题






7.总结


五、线程本地存储


1.静态TLS




2.动态TLS







六、多线程间的消息通讯









示例:一个线程向另一个线程发送消息


使用PeekMessage写法如下:

七、C++11多线程
相关文章:
Win32和c++11多线程
Win32和c11多线程 一、概念1.线程的特点线程内核对象线程控制块线程是独立调度和分派的基本单位共享进程的资源 2.线程的上下文切换引起上下文切换的原因 3.线程的状态 二、Windows多线程API1.CreateThread创建线程2.获取线程ID3.关闭线程句柄4.挂起线程5.恢复线程6.休眠线程的…...
关于python包导入问题的重思考
将顶层目录直接设置为一个包 像这样,每一个文件从顶层包开始导入 这样可以解决我的问题,但是要注意的时,要避免使用出现上下级出现同名包的情况,比如: AutoServer--AutoServer--__init__.py--__init__.py这种情况下…...
攻防世界---misc---津门杯2021-m1
1、题目描述,下载附件是一张bmp格式的图片 2、直觉告诉我这和图片的颜色通道有关 3、于是我就尝试用stegslove打开图片 4、将颜色通道都改为0,点击preview 5、然后发现一串base64编码 6、解码得flag flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}...
【计算机视觉(8)】
基于Python的OpenCV基础入门——图像直方图 直方图图像直方图 图像直方图代码以及实现效果 直方图 直方图是一种用于描述图像亮度分布的统计工具。它将图像的像素亮度值按照不同的亮度等级进行计数,并以直方图的形式呈现出来。图像直方图可以显示图像中每个亮度级别…...
Linux操作系统:Redis在虚拟环境下的安装与部署
Redis下载方法 最近部署项目的时候用到了Redis,自己在安装的时候也碰到了一些列问题最终安装成功,记录一下自己的安装历程。前期准备: 服务器Linux版本:Centos8.4 64位(http://isoredirect.centos.org/centos/8/isos/…...
哈希表和二维矩阵的结合-2352. 相等行列对(新思路、新解法)
题目链接及描述 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/equal-row-and-column-pairs/description/?envTypest…...
深度学习中无监督学习
深度学习中的无监督学习 无监督学习(Unsupervised Learning)是一种机器学习方法,在没有标签数据的情况下,从数据中提取有意义的模式和特征。无监督学习广泛应用于深度学习中,以解决数据标注困难和大量无标签数据存在的…...
JVM基础知识
一、JVM的内存区域划分 一个进程在运行的时候,会向操作系统申请到内存资源,从来存放程序运行的相关数据。 JVM本质上就是一个java进程,在运行的时候也会从操作系统那搞一块内存,供Java代码执行使用。 JVM又把申请的一块内存根据不同的用途划分出了不同区域。 每一…...
618网购节,电商能挡住恶意网络爬虫的攻击吗?
目录 爬虫盗取电商数据的步骤 电商平台如何发现网络爬虫? 如何拦截违法网络爬虫 2023年,杭州中院审结了两起涉及“搬店软件”的不正当竞争案件。本案的原告是国内某大型知名电子商务平台的运营主体,而被告则是开发了一款名为“某搬家快速商品…...
Codeforces Round 951 (Div. 2) C、D(构造、线段树)
1979C - Earning on Bets 构造题:观察到k范围很小,首先考虑最终硬币总数可以是多少,我们可以先假设最终的硬币总数为所有k取值的最小公倍数,这样只需要满足每个结果添加1枚硬币即可赚到硬币。 // Problem: C. Earning on Bets //…...
elmentUI el-table 总结行
背景 原因:表格展示的都是明细数据,需要对当前的明细数据的部分字段进行汇总难点:汇总的条件不一定,有时候客户查的是1天,有时候是10天 官方写法 只开启开关 开启汇总开关如果没有汇总方法, 会自动汇总所有…...
【大数据】计算引擎:Spark核心概念
目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…...
Python | C# | MATLAB 库卡机器人微分运动学 | 欧拉-拉格朗日动力学 | 混合动力控制
🎯要点 🎯正向运动学几何矩阵,Python虚拟机器人模拟动画二连杆平面机械臂 | 🎯 逆向运动学几何矩阵,Python虚拟机器人模拟动画三连杆平面机械臂 | 🎯微分运动学数学形态,Python模拟近似结果 | …...
Signac|成年小鼠大脑 单细胞ATAC分析(1)
引言 在本教程中,我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞(PBMC)的Signac入门教程中执行的命令。…...
【POSIX】运行时so库动态加载
运行时可以自己自定义so库的动态加载框架,主动去加载某些库,并调用其中的某些方法 首先写一些方法,并生成so库 // hello.cpp#include <iostream>/*使用 nm 命令查看 so 库的内容 */// 1. 使用extern // dlsym(handle, "hello&qu…...
爱普生SG2520CAA汽车电子中控专用晶振
随着汽车电子技术的飞速发展,汽车中控系统变得越来越智能化和复杂化。为了确保这些系统的高性能和高可靠性,选择符合AEC-Q200标准的高品质晶振至关重要。爱普生SG2520CAA晶振凭借其优异的特性,成为汽车电子中控系统的理想选择。 爱普生晶振SG…...
Vue——监听器简单使用与注意事项
文章目录 前言编写简单demo注意事项 前言 监听器,在官网中称为侦听器,个人还是喜欢称之为监听器。官方文档如下: vue 官网 侦听器 编写简单demo 侦听器在项目中通常用于监听某个属性变量值的变化,并根据该变化做出一些处理操作。…...
OpenCV的“画笔”功能
类似于画图软件的自由笔刷功能,当按住鼠标左键,在屏幕上画出连续的线条。 定义函数: import cv2 import numpy as np# 初始化参数 drawing False # 鼠标左键按下时为True ix, iy -1, -1 # 鼠标初始位置# 鼠标回调函数 def mouse_paint(…...
uniapp封装picker选择器组件,支持关键字查询
CommonPicker.vue组件 路径在 components\CommonPicker.vue <template><view><uni-easyinput v-model"searchQuery" :placeholder"placeholder" /><picker :range"filteredOptions" :range-key"text" v-model&…...
智慧城市的规划与实施:科技引领城市运行效率新飞跃
随着信息技术的飞速发展,智慧城市的构想正逐步成为现实。作为地理信息与遥感领域的研究者,我深知在这一转型过程中,技术的创新与应用是提升城市运行效率的关键。本文旨在探讨如何利用地理信息系统(GIS)、遥感技术、大数…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...


