线程同步-用内核对象进程线程同步

线程和内核对象的同步 线程和内核对象的同步,详细的讲解了4种内核对象的同步过程,以及他们之间的差别 立即下载

线程同步的几种方法

一 : 使用内核对象

1:事件对象

事件对象分为两种

当一个手动重置事件对象被触发时 正在等待该事件的素有线程都将变成可调度的状态( 一旦有信号被触发 则 所有等待线程都将往下执行)

而当一个自动重置事件对象被触发的时候,只有一个证在等待该事件的线程会变成可调度状态(一旦有信号被触发,只有一个等待线程会往下执行 再有信号被触发时 会再有另外一个线程往下执行)

 

 

当WaitForSingleObject等待到一个手动重置事件对象信号的之后 要希望事件对象再变为无信号状态  需要调用ResetEvent  

而当等待到一个自动重置事件对象的之后 会自动将事件对象设为无信号状态 无需调用ResetEvent  

Event Function

Description

CreateEvent

Creates or opens a named or unnamed event object.

OpenEvent

Opens an existing named event object.

PulseEvent

Sets the specified event object to the signaled state and then resets it to the nonsignaled state after releasing the appropriate number of waiting threads.

ResetEvent

Sets the specified event object to the nonsignaled state.

SetEvent

Sets the specified event object to the signaled state.

 

 

2:互斥量对象

互斥量对象用来确保一个线程独占对一个资源的访问

CreateMutex创建一互斥量对象

OpenMutex   打开一互斥量对象

ReleaseMutex释放互斥量对象所有权

 

A线程创建hMutex之后

 

B线程 
WaitForSingleObject(hMutex, 5000L);     à一旦等待到互斥量信号便拥有了对以下资源的访问权  其他线程就进不来了
//…Code
ReleaseMutex(hMutex)  à释放互斥量对象所有权 让其他线程可以进来

 

Mutex Function

Description

CreateMutex

Creates or opens a named or unnamed mutex object.

OpenMutex

Opens an existing named mutex object.

ReleaseMutex

Releases ownership of the specified mutex object.

 

 

3:临界区

临界区:简述

如果您非常熟悉临界区,并可以不假思索地进行应用,那就可以略过本节。否则,请向下阅读,以对这些内容进行快速回顾。如果您不熟悉这些基础内容,则本节之后的内容就没有太大意义。

临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。通常在修改全局数据(如集合类)时会使用临界区。事件、多用户终端执行程序和信号量也用于多线程同步,但临界区与它们不同,它并不总是执行向内核模式的控制转换,这一转换成本昂贵。稍后将会看到,要获得一个未占用临界区,事实上只需要对内存做出很少的修改,其速度非常快。只有在尝试获得已占用临界区时,它才会跳至内核模式。这一轻量级特性的缺点在于临界区只能用于对同一进程内的线程进行同步。

临界区由 WINNT.H 中所定义的 RTL_CRITICAL_SECTION 结构表示。因为您的 C++ 代码通常声明一个 CRITICAL_SECTION 类型的变量,所以您可能对此并不了解。研究 WINBASE.H 后您会发现:

typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;

我们将在短时间内揭示 RTL_CRITICAL_SECTION 结构的实质。此时,重要问题在于 CRITICAL_SECTION(也称作 RTL_CRITICAL_SECTION)只是一个拥有易访问字段的结构,这些字段可以由 KERNEL32 API 操作。

在将临界区传递给 InitializeCriticalSection 时(或者更准确地说,是在传递其地址时),临界区即开始存在。初始化之后,代码即将临界区传递给 EnterCriticalSection 和 LeaveCriticalSection API。一个线程自 EnterCriticalSection 中返回后,所有其他调用 EnterCriticalSection 的线程都将被阻止,直到第一个线程调用 LeaveCriticalSection 为止。最后,当不再需要该临界区时,一种良好的编码习惯是将其传递给 DeleteCriticalSection。

在临界区未被使用的理想情况中,对 EnterCriticalSection 的调用非常快速,因为它只是读取和修改用户模式内存中的内存位置。否则(在后文将会遇到一种例外情况),阻止于临界区的线程有效地完成这一工作,而不需要消耗额外的 CPU 周期。所阻止的线程以内核模式等待,在该临界区的所有者将其释放之前,不能对这些线程进行调度。如果有多个线程被阻止于一个临界区中,当另一线程释放该临界区时,只有一个线程获得该临界区。

 

 

Critical-Section Function

Description

DeleteCriticalSection

Releases all resources used by an unowned critical section object.

EnterCriticalSection

Waits for ownership of the specified critical section object.

InitializeCriticalSection

Initializes a critical section object.

InitializeCriticalSectionAndSpinCount

Initializes a critical section object and sets the spin count for the critical section.

LeaveCriticalSection

Releases ownership of the specified critical section object.

SetCriticalSectionSpinCount

Sets the spin count for the specified critical section.

TryEnterCriticalSection

Attempts to enter a critical section without blocking.

 

 

以上 临界区的优点是速度快 (只是读取和修改用户模式内存中的内存位置)

事件对象和互斥量要去内核修改信号(在Ring3及Ring0之间的转换相当消耗时间) 但是缺点是会造成死锁

线程与内核对象的同步 将要介绍如何使用内核对象来实现线程的同步 立即下载

相关推荐

用Navicat轻松管理魔兽世界私服数据库:修改IP、添加装备的实用技巧

本文详细介绍了如何使用Navicat管理魔兽世界私服数据库,包括修改服务器IP、添加自定义装备和调整角色属性等实用技巧。通过专业的SQL操作指南,帮助玩家轻松实现私服的高级定制,提升游戏体验。

fanta的博客 937

window核心编程-内核对象线程同步

window核心编程-内核对象线程同步 1、内核对象线程同步介绍 上一章讲了关键字(临界区)线程同步,使用关键字线程同步,我们很容易陷入死锁的情形,这是因为我们无法为进入关键段指定一个最长等待时间。 本章将讨论如何使用内核对象来对线程同步。我们也将看到,与用户模式下的同步机制(关键段同步)相比,内核对象的用途要广泛的多。实际上,内核对象唯一的缺点就是它们的性能。内核对象包括进程、线程以及

程序人生的专栏 3666

实测昇腾310P跑Qwen3有多慢?手把手带你部署vLLM并记录性能数据

本文实测了昇腾310P在vLLM框架下部署Qwen3模型的性能表现,详细记录了2.5 tokens/s的生成速度及其技术瓶颈。通过环境搭建、基准测试和深度分析,揭示了计算资源利用率不足等关键问题,并提供了实用的优化技巧与监控方案,帮助开发者更好地理解和优化昇腾平台上的大模型部署。

weixin_28724319的博客 891

线程与内核对象的同步小结

线程与内核对象的同步 1为什么使用内核对象实现线程同步   1.1用户模式下实现线程同步特点   (1)同步速度快 (2)互锁函数族只能对单值进行操作,无法是线程进入等待状态。 (3)临界区可以使线程进入等待状态,但是只能用于同一个进程的多个线程。由于无法设置超时操作,因此容易进入死锁状态。   1.2内核模式下实现线程同步特点   (1)内核对象机制的唯一缺点:速度慢。

不积硅步,无以至千里;不积小流,无以成江海 1024

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有:FairyGUI,VSCode代码环境涉及到了:LuaVSCode插件:EmmyLua在编写FairyGUI编辑器菜单前,了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能实现的,插件中我使用的是lua环境模板。导入编辑器的LuaAPI,文件可以在FairyGUI-Editor源码的插件目录中找到。接下来将通过功能来说明对应的API作用。

Aili_Xiao的博客 4496

D类功放LC滤波器实战:从Q值0.707到EMI优化的完整设计流程

本文详细解析了D类功放LC滤波器的完整设计流程,从确定截止频率与Q值0.707的理论基础出发,到参数计算、仿真验证及关键元器件选型,并提供了应对EMI超标和过流保护等实际问题的进阶调试策略。文章强调,精准的LC滤波器设计是平衡音质、稳定性与电磁兼容性的关键,尤其需关注电感饱和电流与电容直流偏置等细节。

e4f5g6h7的博客 1034

windows笔记-【内核对象线程同步】线程同步对象速查表

对象 何时处于未通知状态 何时处于已通知状态 成功等待的副作用 进程 当进程仍然活动时 当进程终止运行时(ExitProcess,TerminateProcess) 无 线程 当线程仍然活动时 当线程终止运行时(ExitThread,TerminateThre...

weixin_30603633的博客 173

基于FPGA进位链的TDC高精度延时链设计与实现

本文详细介绍了基于FPGA进位链的高精度TDC延时链设计与实现方法。通过利用FPGA的CARRY4硬件资源,构建了理论分辨率达13.25ps/级的延时链,并提供了Verilog代码实现、物理布局约束技巧以及温度补偿策略。文章还涵盖了标定方法、数据转换处理和系统验证方案,为激光测距、高能物理等需要精确时间测量的应用提供了实用解决方案。

weixin_28731223的博客 486

windows核心编程---用内核对象进行线程同步

-概述 1.内核对象线程同步 优点: 可跨进程使用 可指定超时时间 缺点: 相比用户模式线程同步更耗时2.进程,线程,作业…几乎所有这些内核对象都可以用来同步。 对线程同步来说,这些内核对象中的每一种要么处于触发状态,要么处于未触发状态。进程内核对象,在进程终止时,操作系统自动使进程内核对象变为触发状态。 线程内核对象在创建的时候处于未触发状态,当线程终止时,操作系统自动将线程对象的

x13262608581的博客 947

从零构建:用Simulink搭建固定翼无人机六自由度模型的避坑指南

本文详细介绍了使用Simulink从零构建固定翼无人机六自由度动力学模型的完整流程和避坑指南。重点解析了模型架构设计、气动力计算、参数配置、仿真求解器选择等关键环节的常见问题与解决方案,帮助开发者快速建立准确可靠的无人机控制系统仿真模型。

hhh00的博客 999

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

进程与线程(六)用内核对象进行线程同步(下)

信号量,资源计数为0时未触发,计数大于0时触发,现在看这个例子可能不会觉得有什么用,等到多线程这块结束时拿出一个我高二时写的多线程的例子~就会看出其用处了~暂且无聊一下~ 1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 2 { 3 _tsetlocale(LC_ALL,_T("chs") ); 4 s

Returns' Station 739

MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现)

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。

qq_36130719的博客 556

进程与线程(五)用内核对象进行线程同步(上)

当系统初始化一个内核对象时,会将其结构内部的一个变量初始化为FALSE,也就是未触发状态。线程可以等待一个内核对象,进入等待状态,当这个内核对象变为TURE的触发状态时,唤醒线程。 线程内核对象在线程初始化时设置为未触发,当线程结束时设置为触发,所以我们可以用WaitForSingleObject来等待一个线程的结束,CreateEvent可以创建一个事件内核对象,可以用来进行同步。

Returns' Station 513

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

windows核心编程之进程&线程

在前一章总结内核对象时提到过进程内核对象和线程内核对象,但是对进程线程以及进程内核对象和线程内核对象在其中的意义还不是很清楚,下面就详细说说进程与线程,进程内核对象和线程内核对象,进程与进程内核对象,线程与线程内核对象之间的千丝万缕的联系。   在开始之前,提出两个面试中经常遇到的简单问题:(1)进程与线程的联系和区别 (2)在多线程编程中为什么要考虑同步互斥操作?两个问题的解答在本章最后给出

miraclewgf的博客 557

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Windows核心编程 第九章 线程与内核对象的同步(上)

第9章线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法。用户方式同步的优点是它的同步速度非常快。如果强调线程的运行速度,那么首先应该确定用户方式的线程同步机制是否适合需要。 虽然用户方式的线程同步机制具有速度快的优点,但是它也有其局限性。对于许...

墨鱼菜鸡 265

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Windows API学习---线程与内核对象的同步

前言   若干种内核对象,包括进程,线程和作业。可以将所有这些内核对象用于同步目的。对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中。这种状态的切换是由Microsoft为每个对象建立的一套规则来决定的。例如,进程内核对象总是在未通知状态中创建的。当进程终止运行时,操作系统自动使该进程的内核对象处于已通知状态。一旦进程内核对象得到通知,它将永远保持这种状...

dinaoju5134的博客 163

Windows核心编程 - 用内核对象进行线程同步

在上一篇文章Windows核心编程-用户模式下的线程同步中已总结了用户模式下的几种同步机制,它们的特点就是速度快,但也有些局限性。那么与用户模式的同步机制相对的,可以使用内核对象进行同步,既然是内核对象,那么就涉及到用户模式与内核模式切换,所以内核对象同步机制的缺点是会有性能问题,但它们的用途会更广一些,例如可以实现进程间的同步。 同步,其实是一方A需要感知另一方...

yjianlu的专栏 295

进程与线程复习知识点

对于CPU而言,系统中有一大堆的线程等着被执行,CPU是根据线程优先级去决定执行哪一个线程,在执行线程之前,CPU为线程分配一个时间片,当线程执行起来,耗尽了时间片,就会执行另一个线程,如此往返,使得线程被轮流执行,但是我们这里想想,一个线程在退出CPU的时候,是不是应该去保存一下他当前的状态,以便下一次执行的时候,我们可以按照之前继续执行,所以就有了线程环境这一概念,在线程的内核对象中,有这样一个结构体来保存线程环境,当然我们可以通过API获取线程环境,设置线程环境。在每一个进程对象中,都有一个句柄表。

sinat_40572875的博客 283

-【内核对象线程同步】概述

用户方式同步的优点是它的同步速度非常快。但它也有其局限性。 例如,互锁函数家族只能在单值上运行,根本无法使线程进入等待状态。可以使用关键代码段使线程进入等待状态,但是只能用这些代码段对单个进程中的线程实施同步。还有,使用关键代码段时,很容易陷入死锁状态,因为在等待进入关键代码段

http://www.softwareace.cn 王牌软件 300

彩色钢笔墨水选购与使用全指南:从入门到进阶

彩色钢笔墨水(彩墨)是一种为书写和创作增添色彩与艺术表现力的特殊墨水。其工作原理基于染料或颜料的溶解与附着,通过调整配方实现不同的流动性、干燥速度和视觉效果。彩墨的技术价值在于将功能性书写与个性化表达相结合,极大地拓展了钢笔的应用场景,从日常笔记、书法练字到手帐装饰和艺术绘画。在实际应用中,用户需要关注墨水的基础性能,如流动性、洇纸程度,以及其与不同钢笔、纸张的兼容性。本文聚焦于彩墨的选购策略与使用技巧,特别针对新手入门,系统梳理了主流品牌的特点、适用场景及性能测试方法,旨在帮助用户规避常见误区,高效构建自

weixin_33863087的博客 398

windows C++多线程同步<1>-进程/线程概念

C++多线程同步

doubleintfloat的博客 472

win32 c语言创建线程,【原创】win32线程及线程内核对象

内核对象与GDI对象GDI对象:1. DC2. 画笔3. 画刷内核对象1. 进程 process2. 线程 thread3. 文件 file4. 事件 envent5. 信号量 signal6. 互斥器 mutexes7. 管道 pipe二者本质相同,GDI对象由GDI32.DLL管理,而内核对象由KERNEL32.DLL管理。二者有个主要的不同是:GDI对象有单一拥有者,不是进程就是线程。内核对...

weixin_39832348的博客 413

几个用于线程同步对象的区别

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。 关键代码段是工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值。

367

linux 线程 waitforsingleobject,WaitForSingleObject、WaitForMulitpleObjects和SignalObjectAndWait线程同步...

WaitForSingleObject、WaitForMulitpleObjects和SignalObjectAndWait线程同步2010-12-10 15:47 类型:生活点滴用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。Wind...

weixin_31689651的博客 318
上一篇: OpenThread的调用
下一篇: 【LIUNX】---TCP/IP学习与实践[基于原始套接字的rootkit]
cmdhack
博客等级 码龄19年 20粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值