作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想从多个线程递增一个无符号整数。
我知道 Interlocked.Increment,但它不处理无符号整数。我可以使用 lock(),但出于性能原因我宁愿不使用。
仅以正常方式递增它是否线程安全?偶尔的增量丢失也没关系,因为它只用于统计。我不希望值(value)被破坏。
最佳答案
您说您出于性能原因不想使用 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 unchecked((uint) newValue);
}
public static void Main()
{
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
}
}
输出:
2147483647
2147483648
2147483649
(换句话说,它可以毫无问题地换行。)
关于C#多线程无符号递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/934619/
我是一名优秀的程序员,十分优秀!