gpt4 book ai didi

C#多线程无符号递增

转载 作者:可可西里 更新时间:2023-11-01 07:50:46 26 4
gpt4 key购买 nike

我想从多个线程递增一个无符号整数。

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

仅以正常方式递增它是否线程安全?偶尔的增量丢失也没关系,因为它只用于统计。我不希望值(value)被破坏。

最佳答案

您说您出于性能原因不想使用 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 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com