【经验总结】C#常用线程同“.NET研究”步方法应用场景和实现原理
简单描述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复杂的多,性能也不好,尽量少用。
转载于:https://www.cnblogs.com/waw/archive/2011/10/18/2217007.html
【经验总结】C#常用线程同“.NET研究”步方法应用场景和实现原理相关推荐
- WebRTC源码研究(4)web服务器工作原理和常用协议基础
文章目录 WebRTC源码研究(4)web服务器工作原理和常用协议基础 前言 做WebRTC 开发为啥要懂服务器开发知识 1. Web 服务器简介 2. Web 服务器的类型 3. Web 服务器的工 ...
- 通俗易懂,常用线程池执行的-流程图
转载自 通俗易懂,常用线程池执行的-流程图 有时候花了大把时间去看一些东西却看不懂,是很 " 蓝瘦 " 的,花时间也是投资. 本文适合: 曾了解过线程池却一直模模糊糊的人 了解得 ...
- oracle线程阻塞_Oracle Service Bus –线程阻塞案例研究
oracle线程阻塞 本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程. 本文也是您提高线程 ...
- Oracle Service Bus –线程阻塞案例研究
本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程. 本文也是您提高线程转储分析技能的绝佳机会 ...
- 基于应用层自身反远程线程注入的研究
基于应用层自身反远程线程注入的研究 现状:目前所有已知的反远程注入方式:r0层hook 句柄的获取,返回失败,让应用层注入者拿不到目标进程的句柄,如hook ntopenprocess ntdubli ...
- Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义
为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...
- python 线程池的研究及实现
2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/coser/archive/2013/01/28/2581018.html ...
- Java常用线程池-固定线程池使用
Java常用线程池-固定线程池使用 固定线程池 固定线程池 在执行数据处理时不可避免的需要使用多线程进行数据处理,以此提高数据处理效率,降低处理时间.而线城池现在池容器对数据处理效率提升有举足轻重的作 ...
- ASP.NET中常用的文件上传下载方法
ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...
最新文章
- ie6下js更新元素display:block后,仍然不显示的hack办法
- shell 调用mysql 存储过程_shell调用mysql的存储过程以及SQL
- deepin配置反向代理映射本地到公网
- git commit或者pull代码时提示代码冲突解决方法
- linux服务器静态ip,Ubuntu Linux系统下设置静态IP的方法
- Python调用C语言
- C/C++预处理指令
- Build Settings发布设置
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_36、SpringBoot整合mybatis之事务处理实战...
- Linux 内核与模块调试
- 《HRNet-OCR:Object-Contextual Representations for Semantic Segmentation》论文笔记
- hdu 5455 Fang Fang 坑题
- 专利修改:ps换填充色
- 深入浅出WPF——XAML的优点
- vue虚拟DOM原理
- python学习_3
- 计算机知识宣传黑板报,计算机黑板报内容
- jenkins的404问题
- 每日涨停个股增量加入股票池,持续跟踪走势!股票量化分析工具QTYX-V2.6.5
- 简述配置php运行环境的大致步骤,简述手工安装、配置PHP运行环境的大致步骤。...