C#多线程无符号增量
问题描述:
我想从多个线程增加一个无符号整数。C#多线程无符号增量
我知道Interlocked.Increment,但它不处理无符号整数。我可以使用lock(),但如果可能出于性能原因,我宁愿不使用。
它是线程安全的,只是以正常的方式增加它?偶尔增加的数据丢失并不重要,因为它仅用于统计数据。我不想要的是损坏的价值。
答
如果你真的需要全方位unsigned int型的(2^32 - 1),而不是一个有符号整数(2^231-1),你可以转换为64位整数(有一个Interlocked.Increment
需要int64的重载),然后转换回unsigned int。
答
你说你不想使用lock
出于性能的原因 - 但你测试过吗?一个无争议的锁(这可能是,它的声音)是相当便宜。
当谈到线程化(通常,但特别是线程化)时,我通常会选择“明显正确”,而不是“聪明并可能更好地执行”。
基准测试你的应用有无锁定,看看你是否能够注意到它们之间的差异。如果锁定造成显着差异,那么确定使用狡猾的东西。否则,我只是坚持一个锁。
一个你可能想要做的事情是使用Interlocked.Increment
与int
和只投它在必要时获得uint
,像这样:
using System;
using System.Reflection;
using System.Threading;
public class Test
{
private static int count = int.MaxValue-1;
public static uint IncrementCount()
{
int newValue = Interlocked.Increment(ref count);
return (uint) newValue;
}
public static void Main()
{
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
}
}
输出:
2147483647
2147483648
2147483649
(换句话说,它没有任何问题。)
这只能确保对v可变的会立即写回到内存中,而不是等待线程退出或寄存器中的值被移位。它不保护对现场的访问,即两个(或更多)线程可以读取相同的值,递增一次,然后写回,从而有效地将值增加1. – 2009-06-01 12:42:49
请阅读上述要求以及 http: //msdn.microsoft.com/en-us/library/7a2f3ay4.aspx。 对于给定的情况就足够了。 – Sesh 2009-06-01 15:00:23
与Interlocked.Increment相比,性能如何变化?相同?更好? – jrista 2009-06-07 02:08:42