当前位置: 首页 > 知识库问答 >
问题:

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

狄晟睿
2023-03-14

如何在C#中获得性能最佳的线程安全计数器?

这很简单:

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

但有更快的替代方案吗?

共有3个答案

孟鸿朗
2023-03-14

我建议你使用。NET在系统中内置了联锁增量。线程库。

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

Interlocked.Increment(ref myNum);

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

卫骏
2023-03-14

正如其他人推荐的那样,互锁。增量将比lock()具有更好的性能。只需查看IL和Assembly,您将在其中看到增量变成“总线锁”语句,其变量直接递增(x86)或“添加”到(x64)。

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

换句话说,。Netlock()语句所做的比。Net互锁。增量

因此,如果您只想增加一个变量,Interlock。增量会更快。查看所有Interlock方法以查看可用的各种原子操作并找到适合您需求的原子操作。当您想执行更复杂的事情(例如多个相互关联的递增/递减)或序列化对比整数更复杂的资源的访问时,请使用lock()

孟翰海
2023-03-14

这会更简单:

return Interlocked.Increment(ref COUNTER);

MSDN互锁。定期的加薪

 类似资料:
  • 我读过这个主题:C#线程安全快速(est)计数器,并在我的并行代码中实现了这个特性。据我所知,这一切都很好,但它大大增加了处理时间,大约10%。 这让我有点担心,我认为问题在于我做了大量相对便宜的产品( 现在,我看不到解决的办法,但也许我错过了一些明显的东西。我甚至在考虑使用n个计数器(对应于并行化程度),然后在特定的核上增加每个计数器,但这似乎不可行(检测我在哪个核上可能会更昂贵,更不用说复杂的

  • 问题内容: 我从一个非常简单的多线程示例开始。我试图做一个线程安全的计数器。我想创建两个线程,使计数器间歇地增加到1000。以下代码: 据我所知,while循环现在意味着只有第一个线程才能访问计数器,直到达到1000。输出: 我该如何解决?如何获得共享计数器的线程? 问题答案: 两个线程都可以访问您的变量。 您看到的现象称为线程饥饿。输入代码的受保护部分后(很抱歉,我之前错过了它),其他线程将需要

  • 本文向大家介绍C++ 线程安全信号,包括了C++ 线程安全信号的使用技巧和注意事项,需要的朋友参考一下 示例 C ++ 11 C ++ 11标准保证以同步方式初始化函数作用域对象的初始化。这可以用于通过延迟初始化实现线程安全的单例。

  • 关于一次从多个线程访问局部变量的几个问题: > < li> 我有多个线程写入和读取变量值,我是否应该同步访问它? 变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。 如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题? 我应该为此使用volatile吗? 编辑: 我想强调的是,我没有任何并发问题。这是我的具体方案: 一个。我的变量名称是 ,它测量 p

  • 我需要实现线程安全的集群范围计数器map,所以我使用Hazelcast使它成为集群范围的,但不知道如何使它成为线程安全的,我尝试使用AtomicInteger,但看起来像是当一个线程反序列化AtomicInteger以进行增量时,其他线程可能会进行增量并将其放回map中。所以你能给我提点建议吗?某种最佳实践?我认为我可以使用分布式锁实现它,但不确定这是最好的解决方案。

  • 问题内容: 我一直在花一些时间调试一个导致分段错误的程序。该错误是不确定性和断断续续的,这很烦人。我把范围缩小到了。我怀疑是在两个不同的线程中拆分字符串的调用导致了分段错误。我可以在两个不同的线程中调用吗? 谢谢。 问题答案: 不是可重入的,因此不应在线程化应用程序中使用它,而应使用。