use*_*610 2 c# interlocked-increment
我理解的功能Interlocked.Increment和lock().但我很困惑何时使用其中一个.据我所知,Interlocked.Increment增量共享int/long值,而as lock()则意味着锁定代码区域.
例如,如果我想更新字符串值,则可以使用lock():
lock(_object)
{
sharedString = "Hi";
}
Run Code Online (Sandbox Code Playgroud)
但是,Interlocked课程不可能实现这一点.
Interlocked?Interlocked.Increment可以而且应该用于增加共享int变量.功能使用Interlocked.Increment与:
lock(_object)
{
counter++;
}
Run Code Online (Sandbox Code Playgroud)
但Interlocked.Increment性能要低得多.
Interlocked.Increment及其相关方法依赖于硬件指令来对单个32位或64位内存值执行同步修改,从而确保访问同一值的多个线程不会读/写陈旧数据。这是必要的,因为在硬件级别上,处理器具有内存值的本地/总线副本(出于性能考虑,通常称为总线内存或cpu缓存)。
lock(){}对一段代码而不是单个整数值执行同步。而不是依靠硬件指令来同步对变量的访问,结果代码将依靠操作系统同步原语(软件,而不是硬件)来保护内存和代码执行。
此外,使用lock()会发出内存屏障,从而确保从多个CPU访问相同的变量会产生同步的(非陈旧的)数据。在其他语言/平台中,情况并非如此,在这些语言/平台中,必须明确执行内存屏障和防护。
Interlocked在整数值上使用方法更为有效,因为硬件具有对执行必要同步的本机支持。但是此硬件支持仅对诸如__int32和__int64之类的本机积分存在,因为硬件没有高级复杂类型的概念,因此此类类型不会公开这种高级方法Interlocked。因此,您不能用于Interlocked同步System.String或任何System.Object派生类型的分配。
(即使使用较低级别的语言,即使可以使用相同的硬件指令来完成对字符串值的指针分配,事实是,在.NET中,字符串对象未表示为指针,因此它不是我可以避免在任何“纯” .NET语言中都可以使用不安全的方法来解析指针,并确实希望对字符串值进行互锁分配的事实,但是我不认为这是真的您要问的是什么,而且Interlocked不支持此操作,因为在幕后将需要进行GC固定,这可能会比使用lock()。变得更昂贵且更具侵入性。)
因此,对于“引用类型”的同步修改/分配,您将需要使用同步原语(即lock(){},Monitor等)。如果您需要同步的只是一个整数值(Int32,Int64),则使用互锁方法会更高效。如果有多个要同步的整数值,例如使用一个整数递增而第二个整数递减,则使用lock()语句仍然有意义,其中两个整数都需要作为一个逻辑运算进行同步。
| 归档时间: |
|
| 查看次数: |
2235 次 |
| 最近记录: |