C#多线程无符号增量

问题描述:

我想从多个线程增加一个无符号整数。C#多线程无符号增量

我知道Interlocked.Increment,但它不处理无符号整数。我可以使用lock(),但如果可能出于性能原因,我宁愿不使用。

它是线程安全的,只是以正常的方式增加它?偶尔增加的数据丢失并不重要,因为它仅用于统计数据。我不想要的是损坏的价值。

+7

这只能确保对v可变的会立即写回到内存中,而不是等待线程退出或寄存器中的值被移位。它不保护对现场的访问,即两个(或更多)线程可以读取相同的值,递增一次,然后写回,从而有效地将值增加1. – 2009-06-01 12:42:49

+0

请阅读上述要求以及 http: //msdn.microsoft.com/en-us/library/7a2f3ay4.aspx。 对于给定的情况就足够了。 – Sesh 2009-06-01 15:00:23

+0

与Interlocked.Increment相比,性能如何变化?相同?更好? – jrista 2009-06-07 02:08:42

如果你真的需要全方位unsigned int型的(2^32 - 1),而不是一个有符号整数(2^231-1),你可以转换为64位整数(有一个Interlocked.Increment需要int64的重载),然后转换回unsigned int。

你说你不想使用lock出于性能的原因 - 但你测试过吗?一个无争议的锁(这可能是,它的声音)是相当便宜。

当谈到线程化(通常,但特别是线程化)时,我通常会选择“明显正确”,而不是“聪明并可能更好地执行”。

基准测试你的应用有无锁定,看看你是否能够注意到它们之间的差异。如果锁定造成显着差异,那么确定使用狡猾的东西。否则,我只是坚持一个锁。

一个你可能想要做的事情是使用Interlocked.Incrementint和只投它在必要时获得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 

(换句话说,它没有任何问题。)