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

内核对象和两种同步

概念

Windows 中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进
行访问

它的所有者:内核对象的所有者是操作系统内核,而非进程,也就是说当进程退出,内核对象不一定会销毁

法即规则,假设进程A创建了内核对象1,那么它的使用计数便为1,因为初次创建内核对象,使用计数为 1,而如果有其他进程访问内核对象,引用计数便加1,只要引用计数不为0,内核对象1永远不会被销毁,即使进程A退出了,也只会导致引用计数减1,只要它不为0,它就不会被销毁

内核对象和其他对象的区别:主要看是否有安全属性这个参数,

使用方式

通过句柄进行操作,当使用相关创建函数,比如CreateEventW、CreateMutex都会返回一个句柄

表示了所创建的内核对象

知识扩展*:每个进程中都有一个句柄表,存放了所有句柄的handle值

调用规则

hThread = CreateThread(... , &threadId);

这行代码做了两件事

  1. 调用CreateThread创建了一个线程对象(内核对象)

  2. hThread = CreateThread这句代码本身也打开(引用)了这个线程对象,将其句柄存入hThread变量

调用 API CreateThread 的时候,不仅仅是创建了一个内核对象,引用计数+1,还打开了内核对象
+1,所以引用计数变为 2

调用 CloseHandle(hThread),即关闭hthread,然后就不能再通过hthread访问了,但是线程没有关闭,也就是说这个内核对象的引用计数仍为1,那么线程和这个对象之间通过什么联系呢?这个hthread已经关闭了,他们就是通过&threadId进行联系。

具体解释可以看我提的问题

线程同步之信号量

信号量(semaphore)就相当于停车场的门卫,线程好比要停的车

semaphore的组成

1.计数器 该内核对象被使用的次数

2.最大资源数,好比车位

3.当前资源数,好比没被占用的可停车的车位

法即规则,如果当前资源数大于0,那么信号量处于可触发状态,表示有可用资源

2.如果当前资源等于0,未触发状态,表示无可用资源,当前资源数不会小于0,也不会大于最大资源数

3.信号量允许多个线程共享同一份资源,而互斥量不允许,这是他们的区别,但是信号量允许的多个线程的数量是有限制的

CreateSemaphoreW (_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, /安全属性_In_ LONG lInitialCount, 
/初始化时,共有多少个资源是可以用的。_In_ LONG lMaximumCount, /能够处理的最大的资源数量 _In_opt_ LPCWSTR lpName /NULL 信号量的名称
);
WINAPI
ReleaseSemaphore (_In_ HANDLE hSemaphore, /信号量的句柄_In_ LONG lReleaseCount, /将lReleaseCount值加到信号量的当前资源计数上面 _Out_opt_ LPLONG lpPreviousCount /当前资源计数的原始值
);
关闭句柄
CloseHandle (_In_ _Post_ptr_invalid_ HANDLE hObject
);

线程同步之关键代码段

关键代码段也称临界区,通常指多线程中访问同一种资源的那部分代码,工作在用户方式下,在代码执行前,它必须独占对某些资源的访问权,关键代码段不是内核对象,属于用户对象

使用步骤

初始化关键代码段
调用 InitializeCriticalSection 函数初始化一个关键代码段。
InitializeCriticalSection(_Out_ LPCRITICAL_SECTION lpCriticalSection
);

 首先需要构造一个 CRITICAL_SCTION 结构体类型的对象,然后将该对象的地址传递给InitializeCriticalSection 函数。

进入关键代码段
VOID
WINAPI
EnterCriticalSection (_Inout_ LPCRITICAL_SECTION lpCriticalSection
);

 获得指定的临界区对象的所有权,该函数等待指定的临界区对象的所有权,如果该所有权赋予了调用线程,则该函数就返回;否则该函数会一直等待,从而导致线程等待,即阻塞在这里

退出关键代码段
VOID
WINAPI
LeaveCriticalSection (_Inout_ LPCRITICAL_SECTION lpCriticalSection
);

 释放指定的临界区对象的所有权。之后,其他想要获得该临界区对象所有权的线程就可以获得该所有权,和事件里的SetEvent差不多

WINBASEAPI
VOID
WINAPI
DeleteCriticalSection (_Inout_ LPCRITICAL_SECTION lpCriticalSection
);

关键代码段和事件对象的区别在于,执行完线程A可以继续执行线程A,而在事件对象里,执行完线程A后 就必须等待其他线程的SetEvent。内核对象的线程同步,比如互斥量、事件对象、信号量对象不会发生死锁 ,为什么呢?

利用内核对象线程同步的时候,速度较慢,关键代码段速度较快

内核对象可以跨进程,因为它是内核对象,而关键代码段只能作用本进程

相关文章:

内核对象和两种同步

概念 Windows 中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进 行访问 它的所有者:内核对象的所有者是操作系统内核,而非进程,也就是说当进程退出,内核对象不一定会销毁 法…...

水表远程监控系统有什么功能吗?

水表远程监控系统是通过远程传输水表数据,实现对水表的远程监控和管理的一种智能化系统。它主要具备以下功能: 1.远程抄表功能:通过远程传输技术,实现对水表的远程抄表和监控,无需人工上门抄表,节省人力成本…...

zabbix自定义监控

一、案例操作:自定义监控内容 案列:自定义监控客户端服务器登录的人数 需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1、自定义监控内容的操作步骤 1.1 在客户端创建自定义 key 明确需要执行的 linux 命令 who | …...

【AUTOSAR】Com通讯栈配置说明(四)---- Nm模块

Nm模块 NmGlobalConfig NmGlobalConstants NmRxIndicationCallback: callback 函数 NmCycletimeMainFunction:Nm 主函数调用周期 NmDevErrorDetect: 是否支持DET NmVersionInfoApi: 是否支持获取版本信息api PduR模块 PduRBswModules PduRBswModuleRef:关联的BS…...

IMG CXM GPU:面向复杂消费级设备的无缝视觉体验

上周我们推出了一款新的GPU,即IMG CXM。它的三种配置可扩展,为可穿戴设备和高级数字电视等多种消费设备提供无缝用户界面。 消费级设备需要GPU提供什么? 涵盖智能手表和智能眼镜的可穿戴市场为移动中的消费者提供了易于访问的信息。鉴于屏幕尺…...

Kafka如何保证数据高可靠

Kafka它本身其实不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉…...

OpenWRT 中修改SSID的文件

文件位置:/....../package/ramips/drivers/mt7628/files/mt7628.sh //---------------------------------------------文件中option ssid处修改如下: detect_mt7628() { # detect_ralink_wifi mt7628 mt7628 ssidmt7628-ifconfig eth0 | grep H…...

如何在 Linux 中进行网络地址转换 (NAT)?

网络地址转换(Network Address Translation,简称NAT)是一种在网络中使用的技术,它允许将私有网络中的IP地址映射到公共网络上,从而实现多个设备共享单个公共IP地址。在Linux系统中,我们可以使用一些工具和配…...

redis的使用第一章

下载地址:http://redis.io/download 安装步骤: 1.安装gcc yum install gcc2.把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis‐5.0.3.tar.gz tar xzf redis‐5.0.3.tar.gz cd r…...

基于springboot+vue的校园二手交易市场

一、项目背景介绍: 校园二手交易市场是大学生生活中的重要组成部分,它为学生提供了一个便捷的方式来买卖物品。然而,传统的校园二手交易方式存在着信息不对称、交易风险高等问题。为了解决这些问题,基于Spring Boot和Vue的校园二手…...

【CH32】| 01——新建工程 | 下载 | 运行 |调试

系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 失败了也挺可爱,成功了就超帅。 文章目录 1. 新建工程1.1 基于官方IDE [MounRiver Studio]1.1.1 使用官方内置的工程模板新建1.1.2 使用自定义工程模板新建1.1.2.1 新建自…...

【Netty】Promise 源码分析(十七)

文章目录 前言一、Promise 接口二、Netty 的 DefaultPromise2.1、设置任务的成功或失败2.2、获取 Future 任务执行结果和添加监听事件 三、Netty 的 DefaultChannelPromise总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计&…...

测牛学堂:2023最新自动化软件测试教程之python基础(字符串常用api总结)

python字符串常用API总结 1 count 查找某个字符在整个字符串中出现的次数 2 capitalize 将字符串的第一个字符转换为大写 3 center(width,fillchar) 返回一个指定宽度的字符串,fillchar为填充的字符,默认是空格,常用* str1 分隔线 print(st…...

【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)

、 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭…...

MQTT GUI 客户端 可视化管理工具

MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多支持 MQTT v5.0 以及 MQTT v3.1.1 协议,支持通过 WebSocket 连接至 MQTT 服务器以树…...

计算机硬件系统 — 冯诺依曼体系结构运行原理解析

目录 文章目录 目录计算机系统计算机硬件系统(冯诺依曼体系结构)PC 主机硬件CPU(中央处理器)CPU 的组成部分CPU 总线控制器单元运算器单元寄存器组超线程与多核架构三级高速缓存为什么需要缓存三级缓存结构 CPU 的指令集指令集的类…...

10.Linux查看文件内容

在 Linux 中,可以使用多种命令来查看文件内容。以下是几个常用的命令及其用法: cat 命令:以行为单位显示整个文件内容。 cat file.txt # 显示名为 file.txt 的文件内容less 命令:分页显示文件内容,可向前/后翻页、搜索…...

API接口测试—详情版(拼多多根据ID取商品详情)

一、为什么要做接口测试 做接口测试的原因主要有以下几个方面: 1. 确保接口功能正确性:接口是不同软件系统或者不同模块之间的数据传输和交互的通道,通过接口测试能够确保不同系统或者模块之间传递的信息准确无误,从而保证了整个…...

【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤)

【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤) 文章目录 【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤)1. 来源2. 介绍3. 模型方法3.1…...

目前的网络情况与特点

现有网络无法进展安全管理与控制,缺乏可管理与安全性,一旦 网络出现病毒与网络攻击现象,将会涉与到个别部门部数据丢失与影 响相关的业务运作。 1 1.1 采用普通傻瓜式交换机 目前全所各部门采用的交换机根本上为 TP-LINK、D-LINK 10/100M 傻瓜…...

解析IFC:BIM领域的“通用语言”,好而不完美的开放标准

在建筑信息模型(BIM)的数字化协同体系中,IFC(Industry Foundation Classes,工业基础类)无疑是最具影响力的开放文件格式。它就像建筑行业的“通用语言”,打破了不同BIM软件之间的壁垒&#xff0…...

【芯片测试】:SmarTest 开发环境入门

SmarTest 开发环境入门:Eclipse IDE 集成与工作区管理系列: Advantest V93000 SmarTest 8 核心概念解析|第 1 篇(共 8 篇) 适合读者: 初次接触 SmarTest 的测试工程师、ATE 软件开发者前言 很多工程师第一次…...

URDF导入Unity实战指南:坐标系转换与物理仿真校准

1. 为什么URDF导入Unity这件事,2025年依然让人抓耳挠腮你刚在ROS里调通了机械臂的运动学解算,PID参数也压得差不多了,信心满满地想把模型拖进Unity做可视化调试——结果双击URDF文件,Unity弹出一串红色报错:“Unknown …...

A51汇编器Error 21解析与8051开发实践

1. 解析A51汇编器Error 21的根源与应对策略在8051单片机开发过程中,使用Keil C51工具链的A51汇编器时,开发者常会遇到一个令人困惑的报错:"ERROR #21: EXPRESSION WITH FORWARD REFERENCE NOT PERMITTED"。这个错误看似简单&#x…...

AI、机器学习与深度学习的本质区别与选型指南

1. 这不是概念辨析课,而是一张能让你少走三年弯路的“技术地图”我带过三十多个从零起步转行做数据工作的学员,几乎每个人在刚接触这个领域时,都会被这三个词绕晕:AI、机器学习、深度学习。有人翻了十页维基百科,越看越…...

从B73到5000个RILs:手把手拆解玉米NAM群体构建的完整流程与关键决策

玉米NAM群体构建全流程解析:从亲本筛选到RILs优化的科学决策 站在玉米遗传研究的十字路口,我们常常面临一个核心挑战:如何在有限资源下构建既能捕获广泛遗传多样性,又能实现精准定位的群体?2009年,Buckler团…...

服务器末级缓存管理优化与Garibaldi架构解析

1. 服务器末级缓存管理的核心挑战 在现代服务器架构中,末级缓存(Last-Level Cache, LLC)作为CPU与主存之间的关键缓冲层,其管理效率直接影响系统整体性能。传统LLC管理面临一个根本性矛盾:随着核心数量增加和负载多样化,有限的缓存…...

通过curl命令快速测试Taotoken上不同大模型的响应效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken上不同大模型的响应效果 对于开发者而言,在集成大模型能力时,快速验证接口连…...

2026年十家小程序开发公司榜单及全面解读

数字经济全行业渗透的当下,权威的小程序开发服务商排名,早已成为企业筛选技术合作方的核心参考坐标。市面上服务商定位差异大、水平参差不齐,企业如何才能找到技术实力过硬、同时匹配自身成本预期的合作方?本文结合2024-2025年行业…...

(十)工业数据采集与断点续传

一、 工业物联网的致命伤:不稳定的网络环境在实验室或 IT 监控中,网络往往是稳定可靠的。但在工业现场,车间大型电机的电磁干扰、行车移动对光纤的拉扯、以及跨地域厂区的无线网络波动,会导致设备频繁出现“微离线”甚至长达数小时…...