Windows下使用Interlocked系列函数实现的一个轻量级读写锁

Windows API 多线程同步实战:4种核心机制(临界区/互斥量/信号量/事件)性能对比与选型指南 本文深入探讨Windows API中的4种多线程同步机制(临界区、互斥量、信号量、事件),通过性能对比和实战案例,帮助开发者选择最适合的同步方案。文章详细分析了每种机制的特点、适用场景及性能数据,并提供了选型指南和优化技巧,助力提升多线程编程效率。 阅读详情

近日在做多窗口渲染的时候(128个directdraw窗口),苦于WIN系统临界区对于多读者情况下的效率问题,窗口绘制速度仅维护在12至18fps之间(设计速度为25fps,机器为i5 450m,集成显卡,4G内存,绘制线程池大小为4,线程池使用的是以下这贴的代码http://blog.youkuaiyun.com/pjchen/archive/2004/11/06/170606.aspx),就萌生了写一个读写锁的念头,在完成之后进行测试,发现虽然仍然达不到设计速度的25fps,但已提升至20至23fps了,在对读写锁进行测试时,发现在最坏的情况下(只有写者,没有读写),锁效率严重低于系统提供的临界区,在一般情况下(读者多于写者,读相对于写频繁),锁效率优于系统提供的临界区。

以下是锁实现代码:

  

以下是测试代码:

在测试中,仅测试了读者优先的情况,使用10ms的定时等待,比无限等待(传入INFINITE)要更有效率。

 

以上代码必有不到之处,欢迎各位指出。

Unity多线程单例模式:C#内存模型与线程安全实现详解 在并发编程中,线程安全是确保程序稳定运行的核心概念。C#内存模型定义了多线程环境下内存操作的可见性与顺序性规则,编译器优化和CPU指令重排可能导致未同步的代码出现竞态条件。理解锁机制和内存屏障原理对于构建健壮的多线程应用至关重要,它们不仅提供互斥访问,还保证了线程间的内存一致性。在Unity游戏开发场景中,单例模式作为常用的设计模式,常被用于管理全局状态如音频管理器、配置服务等。当AI计算、资源加载等后台线程与主线程并发访问单例时,若缺乏正确的同步措施,极易引发NullReferenceException等 阅读详情

相关推荐

C# Interlocked 类使用详解

C# Interlocked 类使用详解

鲤籽鲲的博客 2411

Windows平台利用Interlocked系列api实现读写锁

Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(InitializeSRWLock,AcquireSRWLockShared,AcquireSRWLockExclusive等)。 网上也有很多读写锁实现,基本上都是用互斥量对象和信号量对象实现。但是对于读写锁这种特殊的锁(锁住时间短)自旋的方式等待应该更合适,用Interlocked系列函数实现读写...

amwfnyq的专栏 527

易语言线程安全核心机制:原子锁与读写锁实战解析

原子性是并发编程四大基本属性之一(其余为可见性、有序性、一致性),它确保对共享资源的操作不会被其他线程打断。例如,一个简单的自增操作i++实际上由三条机器指令组成:读取值、加1、写回内存。如果这三步不能作为一个整体执行,则多个线程并发执行该操作时,可能出现“丢失更新”的问题。考虑如下伪代码:// 非原子操作导致的问题// 步骤1:读取// 步骤2:递增// 步骤3:写回假设有两个线程同时执行,它们都从内存中读取了,各自计算出结果为1,并写回。最终counter。

weixin_30820933的博客 1095

InterLockedIncrement and InterLockedDecrement函数原理

http://hi.baidu.com/drunkdream/blog/item/014e1cce56efe730b600c88e.html InterLockedIncrement and InterLockedDecrement函数原理 2009-07-01 20:57InterLockedIncrement and InterLockedDecrement实现数的原子性加

carl2380的专栏 1090

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

登临科技Goldwasser加速卡Python SDK实战:从环境配置到YOLOv5模型性能压测

本文详细介绍了登临科技Goldwasser加速卡的Python SDK实战指南,从环境配置到YOLOv5模型性能压测的全过程。通过驱动安装、SDK环境搭建、模型转换与推理优化等步骤,帮助开发者高效利用AI加速卡提升深度学习模型性能。重点分享了批量推理压测技巧和常见问题解决方案,助力开发者充分发挥Goldwasser加速卡的算力优势。

weixin_29035147的博客 300

关于多线程Interlocked的使用

/// <summary> /// 标识量(缓冲区中已使用的空间,初始值为0) /// </summary> private static long numberOfUsedSpace = 0; static void Main(string[] args){ //线程:写入者 Thread Writer = new Thread(delegate () { ...

ylq1045的专栏 1421

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1326

C# 多线程二:原子操作Interlocked 互锁的理解和简单示例

Interlocked 多线程

SmillCool的博客 6460

27、视网膜血管识别与分类的数据集和验证过程

本文介绍了视网膜血管自动识别与分类方法所使用的数据集及其验证过程。通过30张高分辨率的近红外反射视网膜图像,结合专业医生的手动标注结果,构建了包含597个血管段的基准数据集。研究采用准确率、召回率、F1分数和混淆矩阵等评估指标对模型进行验证,并提出了特征增强和分类器优化策略以提升性能。实验结果显示,该方法在复杂区域具有较强的鲁棒性和较高的准确性,为临床应用提供了可靠的依据。

i7j8k9l的博客 148

数学建模算法案例精讲500篇-【深度强化学习】深度确定性策略梯度(DDPG)(附MATLAB和python代码实现)

它是一种学习连续动作的无模型策略算法。它结合了DPG(确定性策略梯度)和DQN(深度Q网络)的思想。它利用DQN中的经验重放和延迟更新的目标网络,并基于DPG,可以在连续的动作空间上运行。# 用于生成带有噪声的动作def __init__(self, action_space, mu=0.0, theta = 0.15, max_sigma = 0.3, min_sigma = 0.3, decay_period = 100000):#decay_period要根据迭代次数合理设置# 均值 mu。

qq_36130719的博客 325

C# 浅析并行任务同步机制——Interlocked

i++和i-- 这种原子操作,都不是线程安全的,它的操作包括从内存中读取一个值,给值递增或递减,然后再将它存储回内存。场景:实现一个人数访问的次数,每一个线程代表一次访问,线程安全的操作,应该是最后的访问人数和总数相等,不安全的操作,访问的次数有重复。ConcurrentDictionary:线程安全字典,用来存放访问次数的存放。访问人数实体,声明了一个线程安全的递增操作,一个线程不安全的递增操作。当运行结果中,不安全线程,中存在数据,而安全线程中,不存在重复的数据。优点:与其他技术相比,较快。

scu_Bao的专栏 1698

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 169

C# Interlocked 如何理解和用法

原子操作类提供了一组原子操作方法,确保在多线程环境中安全地操作共享变量。常用方法IncrementDecrementAddExchange和。适用场景:计数器、标志位和简单的原子操作。通过使用类,可以避免多线程环境中的竞争条件和数据不一致问题,从而提高程序的稳定性和性能。

2401_89221867的博客 775

华为昇腾(Ascend)开发考试原题目解析 (2024) (题库一)——HCIP-AI-Ascend Developer——第一部分

给出一段代码如下,以下哪个选项描述错误?...A.中的语句由 MindSpore 接管,有语法限制B. 算子在中定义,并用来建立网络C.__init__()中的语句由 Python 解析执行D. 网络定义必须继承基类nn.Cell正确答案: B__init__()用于定义算子和网络层。所有需要用到的层(如卷积层、全连接层等)都应该在这里进行实例化。这部分代码由Python解释器执行。用于构建前向计算图。它调用在__init__()中定义好的算子和层来描述数据的流向。

qq_38334677的博客 1053

用 XCO 库一键找出某个 ABAP 类的全部子类

ABAP XCO库子类枚举技术解析 本文介绍了在ABAP项目中如何利用XCO库高效获取类的继承层次结构。传统方法使用CL_ABAP_CLASSDESCR或手动维护映射表存在效率低、易遗漏的问题。新方法通过XCO库的IF_XCO_AO_CLASS接口,可简洁地获取父类的所有子类(包括间接子类)。 核心API链式调用: 获取类句柄:xco_cp_abap=>class() 导航子类集合:subclasses->all 获取结果:get()返回类引用表或get_names()返回类名列表 典型应用场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

在Win32下用C++实现多线程读写锁

读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。     现在Win32的API

brk1985的专栏 916

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C/C++多线程编程之九】pthread读写锁

多线程编程之读写锁      Pthread是 POSIX threads 的简称,是POSIX的线程标准。          pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源进行写操作。在互斥机制,读者和写者都需要独立独占互斥量以独占共享资源,在读写锁机制下,允许同时有多个读者读访问共享资源,只有写者才需要独占资源。相比互

Jiangwei的专栏 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

并发编程 - 线程同步(四)之原子操作Interlocked详解一

本文介绍Interlocked类的使用,包括Read、Increment、Decrement和Add方法,适用于多线程环境安全操作变量,解决了非原子操作导致的线程安全问题,并提供示例代码。

IT规划师 759

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

讲解 .NET 中的 Interlocked 类,包括其定义、功能特性、与锁机制的对比、适用场景、常见问题及最佳实践,并提供完整的代码示例和测试用例

原子操作是指不可分割的操作,要么完全执行,要么不执行,不会被其他线程中断。Interlocked 类是 System.Threading 命名空间中的一个静态类,提供原子操作(atomic operations),用于在多线程环境中对共享变量进行高效、线程安全的读写操作,特别适合高性能、低开销的场景。我来详细讲解 .NET 中的 Interlocked 类,包括其定义、功能特性、与锁机制的对比、适用场景、常见问题及最佳实践,并提供完整的代码示例和测试用例。简单操作(增减、比较交换)高(硬件指令,单次操作)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 159

黑马程序员--interlocked(互锁)

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------interlocked(互锁) 当多个线程需要使用统一资源时,就需要进行线程同步,例如对一个CHAR类型变量的读和写 interlocked类的部分方法 read() 读取计数器的值 Increment(

hehe04的专栏 579

在Win32平台中,多读单写锁如何实现?

-------------------------------------------------------------------------------- 标题: 在Win32平台中,多读单写锁如何实现? 作者: 叶飞虎 日期: 2004.03.17 -------------------------------------------------------------------

Kyee编程之道 3039

C# Snowflake

C# 版 雪花算法 参考:GitHub - wzycoding/snowflake

foreverhot1019的博客 494

Windows平台下的读写锁

Windows平台下的读写锁 简单介绍Windows平台下的读写锁以及实现. 背景介绍 Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(InitializeSRWLock, AcquireSRWLockShared, AcquireSRWLockExclusive等).考虑到目前Windows XP的装机量,只能自己实现一个读写锁了.

Que's C++ Studio 1万+

《Windows核心编程》---Interlocked原子访问系列函数

所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。Interlocked系列函数提供了这样的操作。所有这些函数会以原子方式来操控一个值。 Interlocked函数的工作原理取决于代码运行的CPU平台,如果是x86系列CPU,那么Interlocked函数会在总线上维持一个硬件信号,这个信号会阻止其他CPU访问同一个内存地址。我们必须确保传给这些函数的

踏雪无痕 1万+

C#(四十二)之线程同步、互锁

C#(四十二)之线程同步、互锁

camellia的博客 1686
下一篇: 使用JTAG调试Codec Engine算法
zxfishhack
博客等级 码龄20年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值