架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1386|回复: 4

[资料] 【转】C# 多线程并发下各种锁的性能

[复制链接]
发表于 2023-4-13 18:44:49 | 显示全部楼层 |阅读模式
一般情况下,只要涉及到多线程编程,程序的复杂性就会显著上升,性能显著下降,BUG出现的概率大大提升。

多线程编程本意是将一段程序并行运行,提升数据处理能力,但是由于大部分情况下都涉及到共有资源的竞争,所以修改资源对象时必须加锁处理。但是锁的实现有很多种方法,下面就来一起了解一下在C#语言中几种锁的实现与其性能表现。

几种锁的运用方式

1、原子锁

通过原子操作Interlocked.CompareExchange实现“无锁”竞争。

官方解释是为多个线程共享的变量提供原子操作。命名空间:System.Threading

2、临界区

通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。c#中的lock语法就是临界区(Monitor)的一个语法糖。

3、原子性操作

原子性操作,这是一种特例,原子性操作天生线程安全,所以无需加锁。

官方解释为以原子操作的形式递增指定变量的值并存储结果。命名空间:System.Threading

4、读写锁

读写锁允许在有其他程序正在写的情况下读取资源,所以如果资源允许脏读,用这个比较合适。

官方解释表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。命名空间为System.Threading

5、信号量

信号量,为控制一个具有有限数量用户资源而设计。

官方解释限制可同时访问某一资源或资源池的线程数。命名空间为System.Threading

6、事件

用来通知线程有一些事件已发生,从而启动后继任务的开始。

官方解释表示线程同步事件在一个等待线程释放后收到信号时自动重置。 此类不能被继承。

7、互斥量

c#中有一个Mutex类,就在System.Threading命名空间下,Mutex其实就是互斥量,互斥量不单单能处理多线程之间的资源竞争,还能处理进程之间的资源竞争,功能是比较强大的,但是开销也很大,性能比较低。


性能测试代码

运行代码

性能测试结果

QQ截图20230413184337.jpg

注:以上数据仅是当前测试环境硬件性能下的结果,仅能做相对比较。

1)在各种测试中,不加锁肯定是最快的,所以尽量避免资源竞争导致加锁运行。

2)在多线程中Interlocked.CompareExchange始终表现出优越的性能,排在第二位。

3)第三位lock,临界区也表现出很好的性能,所以在别人说lock性能低的时候请反驳他。

4)第四位是原子性变量(Atomic)操作,不过目前只支持变量的自增自减,适用性不强。

5)第五位读写锁(ReaderWriterLockSlim)表现也还可以,并且支持无所读,实用性还是比较好的。

6)剩下的信号量、事件、互斥量,这三种性能最差,当然他们有各自的适用范围,只是在处理资源竞争这方面表现不好。

原文链接地址:https://blog.exsvc.cn/article/csharp-concurrent-lock-performance.html





上一篇:ASP.NET Core(十六)依赖注入之动态注册服务
下一篇:软路由 OpenWrt 通过 U 盘启动运行
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-4-13 18:46:52 | 显示全部楼层
C# 程序只允许运行一个实例的正确代码
https://www.itsvse.com/thread-3391-1-1.html

c#线程学习之ManualResetEvent和AutoResetEvent的区别
https://www.itsvse.com/thread-4810-1-1.html

【实战】.NET/C# 使用 SemaphoreSlim 限制并发执行方法
https://www.itsvse.com/thread-10259-1-1.html

C#读写锁ReaderWriterLockSlim的使用
https://www.itsvse.com/thread-3545-1-1.html

.net/c# 用户多线程并发lock(string){...}详解
https://www.itsvse.com/thread-7764-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2023-4-13 19:21:44 | 显示全部楼层
学习一下。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2023-5-16 20:03:52 | 显示全部楼层
学习一下。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2023-5-19 11:41:25 | 显示全部楼层
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 01:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表