.NET Framework 提供了一系列同步基元来控制线程交互并避免争用条件。这可大致分为三个类别:锁定、通知和联锁操作。
上述类别的定义并非是绝对的:有些同步机制具有多个类别的特征;一次释放一个线程的事件从功能上来说类似于锁;任何锁的释放都可看作一个信号;而联锁操作可用于构造锁。但是,这些类别仍然是有用的。
记住线程同步是协作这一点非常重要。只要有一个线程避开同步机制直接访问受保护的资源,该同步机制就不是有效的。
本概述包含以下几节:
锁向一个线程一次提供一个资源的控制功能,或者向指定数目的线程提供此功能。请求正在使用中的独占锁的线程会被阻止,直到该锁变为可用为止。
独占锁
锁定的最简单的形式是 C# 的 lock 语句(在 Visual Basic 中为 SyncLock),该语句可控制对代码块的访问。这种块通常称为临界区。lock 语句使通过使用 Monitor 类的 Enter 和 Exit 方法实现的,它使用 try…catch…finally 确保该锁被释放。
通常情况下,使用 lock 语句保护小代码块并且不跨越多个方法是使用 Monitor 类的最佳方法。Monitor 类功能强大,但是容易形成孤立锁和死锁。
Monitor 类
Mutex 类
SpinLock 类
从 .NET Framework4 版开始,当 Monitor所需的开销会造成性能下降时,可以使用 SpinLock 类。当 SpinLock 遇到锁定的临界区时,它只是反复地旋转,直至锁变为可用的。如果锁保留的时间非常短,则旋转可比阻塞提供更好的性能。但是,如果锁保留数十个周期以上,则 SpinLock 的表现会和 Monitor 一样,只不过将使用更多的 CPU 周期,因此会降低其他线程或进程的性能。
其他锁
锁不必是独占的。允许有限数目的线程并发访问某个资源通常十分有用。信号量和读写器锁旨在控制此类池资源访问。
ReaderWriterLock 类
Semaphore 类
等待来自另一个线程的信号的最简单的方法是调用 Join 方法,该方法将进行阻塞,直至其他线程完成。Join 具有两个允许阻塞的线程在经过指定时间间隔后停止等待的重载。
等待句柄提供了更为丰富的等待和通知功能。
等待句柄
从 .NET Framework 4 开始,可以使用同步基元,通过尽可能避免依赖高开销的 Win32 内核对象(例如等待句柄)来提高性能。通常,当等待时间较短并且只有在尝试了原始同步类型并发现它们并不令人满意时,才应使用这些类型。在需要跨进程通信的方案中不能使用轻量类型。
返回页首
从 .NET Framework 4 开始,当线程必须等待发生某个事件发出信号时或需要满足某个条件时,可以使用 System.Threading::SpinWait 结构,但前提是实际等待时间预计会少于通过使用等待句柄或通过其他方式阻塞当前线程所需要的等待时间。通过使用 SpinWait,可以指定在一个较短的时段内边等待边旋转,然后只有在相应的条件在指定时间内无法得到满足的情况下放弃旋转(例如,通过等待或休眠)。
返回页首
联锁操作是由 Interlocked 类的静态方法对某个内存位置执行的简单原子操作。这些原子操作包括添加、递增和递减、交换、依赖于比较的条件交换,以及 32 位平台上的 64 位值的读取操作。
说明
原子性的保证仅限于单个操作;如果必须将多个操作作为一个单元执行,则必须使用更粗粒度的同步机制。
|
尽管这些操作中没有一个是锁或信号,但它们可用于构造锁和信号。因为它们是 Windows 操作系统固有的,因此联锁操作的执行速度非常快。
联锁操作可与易失存储器保证一起使用,以编写展示强大的非阻塞并发功能的应用程序。但是,它们需要复杂的低级别编程,因此大多数情况下,简单的锁定是更好的选择。
有关概念性概述,请参见 互锁操作。
分享到:
相关推荐
为实现工业过程中对工件的实时定位,提出了一种基于圆弧基元的工件实时定位与匹配方法。离线过程中,将边缘轮廓多边形近似,进一步分割成线段基元和圆弧基元,制作模板,确定模板中工件的位姿。在线过程中,以最长...
首先借鉴方块编码的思想来定义图像的纹理基元,然后在对纹理基元的统计分布研究的基础上,针对每一种纹理基元构造纹理基元空间分布图,提出采用纹理基元空间分布特征矢量对图像内容进行描述。实验结果表明,该算法既...
针对图像检索问题,提出一种基于像素差分基元矩阵的图像检索方法。该方法结合图像的颜色特征与纹理特征,在量化后的HSV颜色空间中提出10种基元;通过定义的基元扫描图像,生成像素差分矩阵以及基元过渡矩阵。最后...
Probabilistic movement primitives for coordination of multiple human–robot collaborative tasks基于概率运动基元的多任务人机协作论文代码,
CSS和HTML的声明性布局基元
金属有机化学基础过渡金属有机化合物的基元反应PPT课件.pptx
一种新的纹理基元发现及表达方法.有利于开阔纹理学习思维
DMP基于动态运动基元的轨迹学习与规划,可以手动绘制轨迹,也可以载入原始数据
行业资料-电子功用-基于基元电容的存储基元和用于操作存储基元的方法
此软件利用遗传算法实现了基元在有噪声环境下的的识别与提取,开发平台采用VC,界面简单,明了,可修改以及可扩展性很强,是遗传算法入门级的上乘作品!!!
基元检测算法:边缘检测、角点检测、blob检测、多尺度表达 参考博客:http://blog.csdn.net/xiaowei_cqu/article/details/8689055
VC++图形基元的显示/VC++图形基元的显示/VC++图形基元的显示
从一元线性回归的建立、线性回归F检验、线性回归相关系数检验等方面对原煤浮沉基元灰分与密度进行线性回归分析及显著性检验,同时对线性回归方程预测原煤浮沉基元灰分、线性回归率b值及线性回归a值进行不确定度评定,...
面向自然语言处理的现代汉语词义基元结构研究 面向自然语言处理的现代汉语词义基元结构研究
基于表面等离基元效应的金属纳米结构光学特性的研究,李婷,于丽,由于表面等离子激元在物理和工程上的潜在应用,它的光学性质引起了很大的兴趣。光通过孔的超强透射引起了很大的兴趣和研究,其中
OS161 OS-161是由哈佛大学创建的具有指导意义的OS,是一个独立的内核和一个简单的用户区,全部用C编写。 源代码包含对以下内容的实现(由我添加): 锁,条件变量和读写器锁的实现 文件系统调用的实现-打开,关闭...
建立了煤自燃过程中的13个基元反应及其反应顺序和继发性关系,揭示了以氧气引发的持续将煤中原生结构转化为碳自由基并释放气体产物的低活化能链式循环的煤氧化动力学过程,提出了煤氧化动力学理论,阐明了煤自燃产热...
主要介绍了vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
该算法在改进的HSV颜色空间计算边缘梯度,通过定义的基元模板扫描梯度图像,生成梯度基元图像,将基元和非基元像素分别组合成聚合和非聚合像素集合;最后利用颜色自相关图算法对上述两个集合提取特征矢量,实现了...
针对叶片基元叶型建模时对前缘的椭圆形转接需求,采用最小二乘法获得椭圆初始参数值,基于此参数引入改进粒子群算法进一步求解,以点到椭圆垂直距离作为目标函数,建立椭圆参数优化数学模型,从而提高拟合精度。...