質問

私は、複数のスレッドから符号なし整数をインクリメントします。

私はInterlocked.Incrementについて知っているが、それは、符号なし整数を処理しません。私は()ロックを使用することができますが、私はパフォーマンス上の理由から、可能であれば、むしろないでしょう。

はそれだけで通常の方法でそれをインクリメントするスレッドセーフですか?時折増分が失われてしまった場合には、統計情報だけのために使われているように、それは、問題ではないだろう。私はしたくないことは壊れるする値です。

役に立ちましたか?

解決

あなたは、パフォーマンス上の理由から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

(換言すれば、それは問題なくラップ。)

他のヒント

あなたが本当にunsigned int型の全範囲を必要とする場合(2 ^ 32から1)ではなく署名したint型(2 ^ 31 -1)よりも、あなたは(Int64型をとるInterlocked.Incrementのオーバーロードがあります)int64型にキャストできその後、unsigned int型にキャストバックます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top