2012-11-01 50 views
78

在C#中获得最佳性能的线程安全计数器的方式是什么?C#线程安全快速(est)计数器

这很简单,因为它得到:

public static long GetNextValue() 
{ 
    long result; 
    lock (LOCK) 
    { 
     result = COUNTER++; 
    } 
    return result; 
} 

但有更快的办法?

回答

66

所推荐的人,在Interlocked.Increment会有更好的表现比lock()。看看IL和Assembly,你会发现Increment变成了“总线锁定”语句,其变量直接增加(x86)或“添加”到(x64)。

此“总线锁定”语句锁定总线,以防止另一个CPU在主CPU执行其操作时访问总线。现在,看看C#lock()声明的IL。在这里,您将看到拨打Monitor以开始或结束一个部分。

换句话说,.Net lock()声明比.Net Interlocked.Increment做的要多得多。如果你想要做的只是增加一个变量,Interlock.Increment会更快。查看所有联锁方法以查看各种可用的原子操作并找到适合您需要的操作。当你想做更复杂的事情时,使用lock(),比如多个相关的增量/减量,或者序列化比整数更复杂的资源。

+0

向上添加上下文 – fsimonazzi

+0

-1获取实现细节。确实,锁定比原子操作要慢,但这与IL没有任何关系。如果不是这些函数调用的语义,那么这些函数调用将比原子操作快,而这不是IL固有的要求。 – Puppy