2

私はマルチスレッドプログラミングにあまり慣れていません.コードに実装しようとしているときに、理由がわからない例外が発生しました. これについての助けをいただければ幸いです:)
だから、基本的に私はこの小さなコードスニペットを持っています:

string[][] Array1 = new string[thread_count][];

/* Logic to insert data in Array1 */

Thread[] WorkerThreads = new Thread[thread_count];

for (int i = 0; i < thread_count; i++)
{
    /* THE EXCEPTION OCCURS IN THE FOLLOWING LINE */
    WorkerThreads[i] = new Thread(() => GetVal(Array1[i], val, num));
    WorkerThreads[i].Start();
}

for (int i = 0; i < WorkerThreads.Length; i++)
    WorkerThreads[i].Join();  

現在、thread_count の値が 10 に設定されており、IndexOutOfRange 例外が発生しています。デバッガーは i の値を 10 として表示し、Array1[10][] はアクセスしようとしているものです。
ループがそこまで実行されない場合、i の値が 10 に達する方法がわかりません。
誰がどこが間違っているのか指摘できますか? 私はC#を使用しています。

ありがとう

4

5 に答える 5

0

GetVal(Array[i])スレッドが作成される前に、変数ii は thread_count と等しくなります。GetVal(Array[10])この場合、すべてのスレッドが最新のi変数を参照するため、すべてのスレッドが保持されます。

これを解決するには、 でArray[i]使用する前に に割り当てられる変数を作成しGetValます。

for (int i = 0; i < thread_count; i++)
{
    string[] value = Array1[i];

    WorkerThreads[i] = new Thread(() => GetVal(value, val, num));
    WorkerThreads[i].Start();
}
于 2013-08-06T03:42:07.317 に答える