1

私の目標は次のとおりです。

整数には特定の範囲があり、その範囲内のすべての整数をランダムにテストする必要があります。これには複数のスレッドを使用し、共有カウンターを使用して作業をスレッド間で均等に分割したいと思います。カウンターを開始値に設定し、すべてのスレッドに数値を取得させ、それを増やし、いくつかの計算を実行して、結果を返します。この共有カウンターは、ロックを使用してインクリメントする必要があります。そうしないと、テストする整数の範囲にギャップ/オーバーラップが発生するためです。

どこから始めたらいいのかわからない。私が12のスレッドに仕事をさせたいとしましょう、私はします:

for (int t = 0; t < threads; t++)
{
  Thread thr = new Thread(new ThreadStart(startThread));
}

startThread()計算に使用する方法です。

途中で手伝ってくれませんか。Interlockedクラスを使用する必要があることはわかっていますが、それだけです…。

4

1 に答える 1

6

intどこかに(-1最初に初期化された)フィールドがあるとしましょう。

int newVal = Interlocked.Increment(ref theField);

スレッドセーフなインクリメントです。intの上限をオーバーフローする(非常に小さい)リスクを気にしないと仮定すると、次のようになります。

int next;
while((next = Interlocked.Increment(ref theField)) <= upperInclusive) {
   // do item with index "next"
}

ただし、Parallel.Forこれらすべてをより便利に実行できます。

Parallel.For(lowerInclusive, upperExclusive, i => DoWork(i));

または(12スレッドに制限するため):

var options = new ParallelOptions { MaxDegreeOfParallelism  = 12 };
Parallel.For(lowerInclusive, upperExclusive, options, i => DoWork(i));
于 2011-09-29T09:52:11.677 に答える