【经验总结】C#常用线程同“.NET研究”步方法应用场景和实现原理

简介:   简单描述volatile,Interlocked,lock,Mutex,Semaphore,Spin lock,AutoResetEvent,ManualResetEvent,ReaderWriterLockSlim,MethodImplAttribute,WaitHandle常用同步机制的原理和使用场景。

  简单描述volatile,Interlocked,lock,Mutex,Semaphore,Spin lock,AutoResetEvent,ManualResetEvent,ReaderWriterLockSlim,MethodImplAttribute,WaitHandle常用同步机制的原理和使用场景。

  volatile

  只是C#的一个关键字,告诉编译器不能将声明的这个变量进行CPU内部缓存,只能在主内存中操作,类型有限制,volatile并不能实现真正的同步,因为它的操作级别只停留在变量级别,而不是原子级别。如果是在单处理器系统中,是没有任何问题的,变量在主存中没有机会被其他人修改,因为只有一个处理器,这就叫作processor Self-Consistency。但在多处理器系统中,可能就会有问题。 每个处理器都有自己的data cache,而且被更新的数据也不一定会立即写回到主存。所以可能会造成不同步,但这种情况很难发生,因为cache的读写速度相当快,flush的频率也相当高,只有在压力测试的时候才有可能发生,而且几率非常非常小。本质上说并非绝对的同步方法。

  Interlocked

  对于例如int变量等的原子操作,效率高,可靠性高,一般通过CPU的专用指令实现的锁住内存总线实现的。

  lock

  lock与Monitor本身是一致的,lock是做到了C#的关键字一级,是.net对象自身支持的的一种同步机制,对象中有相关的结构支持这种轻量级的线程同步,实现机制类似于CRITICAL_SECTION,但是CRITICAL_SECTION具有跨进程特性,而lock只能实现同一进程中的线程同步,在C#开发中很常用。

  Mutex

  是WIN32下的突变体内核对象的封装,类似于一间屋子只能进入一个人。是它的一个.net封装,效率比较低,由于突变体是一种windows内核对象,需要开销很大,但是支持跨进程,通过给Mutex命上海企业网站设计与制作名的方式支持进程间同步,甚至可以跨服务上海徐汇企业网站制作器访问,是一种服务器之间同步的选择。Mutex的拥有者才能释放这个Mutex,其他进程不能释放,可能是考虑到安全问题。Mutex是一种基于线程调度的同步方式,控制的是线程的调度,实现了sleep,如果有信号可以通知内核线程调度程序调度等待线程。

  Semaphore(Binary semaphore)

  基于WIN32的Semaphore,也是一种基于线程调度,基本很类似于Mutex,与Mutex不同之处在于Semaphore允许多人进入同一间屋子,使用count计数来实现,当允许数量为1时叫做Binary semaphore,这时候就是基本和Mutex很类似的,但是没有Mutex拥有者一说,可由任何进程进行资源释放。

  Spin lock

  这是一个内核态概念。spin lock与semaphore的主要区别是spin lock是busy waiting,而semaphore是sleep。对于可以sleep的进程来说,busy waiting当然没有意义,CPU只是在那里空转而已,而且IRQL比较高,适合于等待时间比较短的场景。对于单CPU的系统,busy waiting当然更没意义(没有CPU可以释放锁),所有Spin lock只对多CPU才有意义,因此,只有多CPU的内核态非进程空间,才会用到spin lock。其实也就是类似mutex的作用,串行化对 critical section的访问。但是mutex不能保护中断的打断,也不能在中断处理程序中被调用。而spin lock也一般没有必要用于可上海闵行企业网站设计与制作以sleep的进程空间。幸好它是内核级的,如果是用户级的会很危险。      AutoResetEvent,ManualResetEvent (Event)

  这两种的实现都是基于WIN32的Event原理,同步事件有两种:AutoResetEvent 上海徐汇企业网站设计与制作和 ManualResetEvent。它们之间唯一的不同在于,无论何时,只要 AutoResetEvent 激活线程,它的状态将自动从终止变为非终止。相反,ManualResetEvent 允许它的终止状态激活任意多个线程,只有当它的 Reset 方法被调用时才还原到非终止状态。

  ReaderWriterLockSlim

  这个也是lock的封装,对资源的访问方式有共享和独占方式,例如我们控制对某个资源读贡献或者写独占,那么这个类可以派上用场。

  SynchronizationAttribute ,MethodImplAttribute

  这两个属于类特性和方法的特性,标识某个类或方法是同步方法,本质上基于lock的实现。

  WaitHandle

  可以通过调用一种等待方法,如 WaitOne、WaitAny 或 WaitAll,让线程等待事件。  System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事件变为终止状态;System.Threading.WaitHand上海网站建设le.Wait上海闵行企业网站制作Any 阻止线程,直到一个或多个指示的事件变为终止状态;System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。当调用事件的 Set 方法时,事件将变为终止状态。WaitOn上海企业网站制作e基于WaitSingleObject,WaitAny 或 WaitAll基于WaitmultipleObject,具体由后面参数来决定。WaitmultipleObject实现要比WaitSingleObject复杂的多,性能也不好,尽量少用。

目录
相关文章
|
29天前
|
API 网络安全 数据安全/隐私保护
.NET邮箱API发送邮件的方法有哪些
本文介绍了.NET开发中使用邮箱API发送邮件的方法,包括SmtpClient类发送邮件、MailMessage类创建邮件消息、设置SmtpClient属性、同步/异步发送、错误处理、发送HTML格式邮件、带附件邮件以及多人邮件。AokSend提供高触达发信服务,适用于大规模验证码发送场景。了解这些技巧有助于开发者实现高效、可靠的邮件功能。
|
1月前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
1月前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
2月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
73 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
62 1
|
2月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
108 3
|
7天前
|
开发框架 .NET 中间件
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
|
10天前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
|
23天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
21 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。