在C#中获得具有最佳性能的线程安全计数器的方法是什么?
这就是最简单的方法:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
但是有没有更快的替代方案呢?
发布于 2012-11-02 00:50:14
发布于 2012-11-02 01:20:21
根据其他人的建议,Interlocked.Increment
将比lock()
具有更好的性能。只需看一下IL和Assembly,您将看到Increment
变成了一个“总线锁”语句,它的变量直接递增(x86)或“加”到(x64)。
这个“总线锁定”语句锁定总线,以防止另一个CPU在调用CPU执行其操作时访问总线。现在,看看C# lock()
语句的IL。在这里,您将看到为了开始或结束一节而调用Monitor
。
换句话说,.Net lock()
语句比.Net Interlocked.Increment
做的多得多。
所以,如果你想做的就是增加一个变量,Interlock.Increment
会更快。查看所有互锁的方法,以查看各种可用的原子操作,并找到适合您需要的操作。当您想要做更复杂的事情,比如多个相互关联的递增/递减,或者序列化对比整数更复杂的资源的访问时,可以使用lock()
。
发布于 2012-11-02 00:50:43
我建议你在System.Threading库中使用.NET内置的互锁增量。
下面的代码将通过引用递增一个long变量,并且是完全线程安全的:
Interlocked.Increment(ref myNum);
https://stackoverflow.com/questions/13181740
复制相似问题