如何在C#中获得性能最佳的线程安全计数器?
这很简单:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
但有更快的替代方案吗?
我建议你使用。NET在系统中内置了联锁增量。线程库。
以下代码将通过引用增加一个长变量,并且是完全线程安全的:
Interlocked.Increment(ref myNum);
来源:http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx
正如其他人推荐的那样,互锁。增量
将比lock()
具有更好的性能。只需查看IL和Assembly,您将在其中看到增量
变成“总线锁”语句,其变量直接递增(x86)或“添加”到(x64)。
此“总线锁定”语句锁定总线以防止另一个CPU在调用CPU执行操作时访问总线。现在,看看C#lock()
语句的IL。在这里,您将看到对Monitor
的调用,以便开始或结束一个部分。
换句话说,。Netlock()
语句所做的比。Net互锁。增量
。
因此,如果您只想增加一个变量,Interlock。增量
会更快。查看所有Interlock方法以查看可用的各种原子操作并找到适合您需求的原子操作。当您想执行更复杂的事情(例如多个相互关联的递增/递减)或序列化对比整数更复杂的资源的访问时,请使用lock()
。
这会更简单:
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中。所以你能给我提点建议吗?某种最佳实践?我认为我可以使用分布式锁实现它,但不确定这是最好的解决方案。
问题内容: 我一直在花一些时间调试一个导致分段错误的程序。该错误是不确定性和断断续续的,这很烦人。我把范围缩小到了。我怀疑是在两个不同的线程中拆分字符串的调用导致了分段错误。我可以在两个不同的线程中调用吗? 谢谢。 问题答案: 不是可重入的,因此不应在线程化应用程序中使用它,而应使用。