処理する次のIDを知ってから、その番号を安全にインクリメントする必要がある多くのスレッドを作成するにはどうすればよいですか?
-
05-07-2019 - |
質問
データを処理する多数のスレッドを持つプログラムを使用しています。
各スレッドは、次に使用可能なIDを取得し、次のスレッドのためにそのIDを1増やし、スレッドセーフな方法でこれを行う必要があります。
これはミューテックスを使用するインスタンスですか?代わりにQueue.Synchronizedを使用して、300,000個すべてのIDを入力する必要がありますか、それとも不要ですか?
1つの整数があれば、その番号の取得と更新を何らかの方法でロックして、thread1が入って「20」を取得する必要があります。次のIDとして、「21」にインクリメントします。別のスレッドが待機している間に
このユースケースのベストプラクティスは何ですか?
解決
Interlocked.Increment を使用して、ロックせずにこれを行うことができます。
次のようにしてください:
private static int value;
public static int Value
{
get { return Interlocked.Increment(ref value); }
}
これは常に、ロックなしで、完全なスレッドセーフで、増分整数を返します。
他のヒント
これはおそらく Interlocked.Increment の完璧な候補です。
int id = 0;
int nextId = Interlocked.Increment(ref id); // returns the incremented value
Increment
はアトミック操作として実行され、スレッドセーフです。
いいえ。
これを行う最良の方法は、Interlocked.Increment()です。
基本的に、CPUアーキテクチャによって提供される保証に基づいて、ロックせずにスレッドセーフな方法でインクリメントを実行できます。
インターロッククラスを確認する必要があります。 。整数の値をアトミックにインクリメントする機能を提供します。
所属していません StackOverflow