C#线程安全快速计数器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (472)

在C#中获得线程安全计数器的最佳方式是什么?

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

但是有更快的选择吗?

提问于
用户回答回答于
用户回答回答于

正如其他人所建议的那样,Interlocked.Increment表现会好于lock()。只要看看IL和Assembly,你会看到它Increment变成了“总线锁定”语句,其变量直接增加(x86)或“添加”到(x64)。

这个“总线锁定”语句锁定总线,以防止另一个CPU在主叫CPU执行其操作时访问总线。现在,看看C#lock()语句的IL。在这里,你将看到调用以Monitor开始或结束一节。

换句话说,.Net lock()语句比.Net更有用Interlocked.Increment

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

扫码关注云+社区

领取腾讯云代金券