首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#线程安全快速(Est)计数器

C#线程安全快速(Est)计数器
EN

Stack Overflow用户
提问于 2012-11-02 00:47:40
回答 5查看 100.6K关注 0票数 181

在C#中获得具有最佳性能的线程安全计数器的方法是什么?

这就是最简单的方法:

代码语言:javascript
复制
public static long GetNextValue()
{
    long result;
    lock (LOCK)
    {
        result = COUNTER++;
    }
    return result;
}

但是有没有更快的替代方案呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-02 00:50:14

这样会更简单:

代码语言:javascript
复制
return Interlocked.Increment(ref COUNTER);

MSDN Interlocked.Increment

票数 299
EN

Stack Overflow用户

发布于 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()

票数 118
EN

Stack Overflow用户

发布于 2012-11-02 00:50:43

我建议你在System.Threading库中使用.NET内置的互锁增量。

下面的代码将通过引用递增一个long变量,并且是完全线程安全的:

代码语言:javascript
复制
Interlocked.Increment(ref myNum);

来源:http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13181740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档