【经验总结】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复杂的多,性能也不好,尽量少用。

目录
相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
12天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
30 5
|
20天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
69 13
|
1月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
51 7
|
1月前
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
|
1月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
1月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
1月前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)