0

私は、データを処理するスレッドの束を持つプログラムに取り組んでいます。

各スレッドは、次に利用可能な ID を取得し、次のスレッドのためにその ID を 1 ずつ増やし、これをスレッドセーフな方法で行う必要があります。

これはミューテックスを使用するインスタンスですか? 代わりに Queue.Synchronized を使用して、300,000 個の ID をすべて入力する必要がありますか、それとも不要ですか?

単一の整数を使用して、その番号の取得と更新を何とかロックして、thread1 が入ってきて、次の ID として「20」を取得し、別のスレッドが待機している間にそれを「21」にインクリメントする必要がありますか?

このユースケースのベストプラクティスは何ですか?

4

4 に答える 4

4

Interlocked.Incrementを介してロックせずにこれを行うことができます。

これを次のように行うだけです:

private static int value;
public static int Value
{
    get { return Interlocked.Increment(ref value); }
}

これは、ロックなしで、完全なスレッドセーフで、常に増加する整数を返します。

于 2009-09-10T01:37:40.583 に答える
2

これはおそらくInterlocked.Incrementの完璧な候補です。

int id = 0;

int nextId = Interlocked.Increment(ref id); // returns the incremented value

これIncrementはアトミック操作として実行され、スレッドセーフです。

于 2009-09-10T01:36:50.127 に答える
1

いいえ。

これを行う最善の方法は、Interlocked.Increment() です。

基本的に、CPU アーキテクチャによって提供される保証に基づいて、ロックせずにスレッドセーフな方法でインクリメントを実行できます。

于 2009-09-10T01:36:44.953 に答える
1

Interlocked クラスを調べる必要があります。整数の値をアトミックにインクリメントする機能を提供します。

于 2009-09-10T01:38:03.517 に答える