1

書き込み操作が実行されているファイルの配列がありますParallel.ForEach。これを高速化するためにループを使用しています。

問題は、複数のスレッドがある場合、そのスレッドが不規則に動作することです。プログラムは、WAVファイルに250000ランダムバイトを10回書き込みます。これにより、約1.3秒の静的期間が発生します。何が起こっているのかというと、複数のスレッドでは、ファイルの大部分に静的なものはなく、Windowsはファイルが変更されたことを示しますが、オーディオコンテンツは変更されていません。他の問題は、一部のクリップに約6分の静的なものがあったことです。それに書き込まれることは不可能ですが、コードは各ファイルに2500000バイト(〜10.3秒)しか書き込みません。そのため、何らかの理由で間違ったファイルにバイトを書き込むため、静的なファイルがないものもあれば、ばかげた量のファイルもあります。静電気を見逃すことは不可能なので、私にはなれません。私は何かがうまくいかないことを知っています。

プログラムをマルチスレッド化する前はすべて正常に機能していたので、使用MaxDegreeofParallelism = 1してすべてが正常に機能したので、問題の原因は複数のスレッドであることがわかります。

Parallel.ForEach(files, new ParallelOptions{MaxDegreeOfParallelism = 4}, file =>
{
Random rand = new Random();
using (stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
{
FileInfo info = new FileInfo(file);
for (int i = 0; i < 10; i++)
{
    int pos = rand.Next(5000000, Convert.ToInt32(info.Length));
    for (int x = 0; x < 250000; x++)
    {
        byte number = array[rand.Next(array.Length)];
        stream.Seek(pos, SeekOrigin.Begin);
        pos += 4;
        stream.WriteByte(number);
    }
}
}
});

編集:他の問題は、複数のスレッドで重要なデータを含むヘッダー部分に書き込むため、メディアプレーヤーがフォーマットを認識しないことです。これは複数のスレッドでのみ発生し、最初の500万バイトは無視しています。これで十分です。

編集:2更新されたコード。

私のコードが正しく機能しない原因となる複数のスレッドについて誰かが光を当てることができますか?

4

2 に答える 2

3

streamによって実行されているデリゲートの外部で宣言されParallel.ForEachます。によって作成されたすべてのスレッドParallel.ForEachは、同じ変数を使用しようとしています。ロックがないため、各スレッドの値が定義streamされていません。おそらく、複数のスレッドが同じストリームに書き込んでいるのが見られ、その結果、奇妙なマルチスレッドの動作が発生します。

streamデリゲートの外部の宣言を削除して、変更してみてください

using (stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))

using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
于 2012-08-13T03:47:24.423 に答える
3

乱数ジェネレーターはスレッドセーフではありません。Jon Skeetには、これとスレッドセーフな乱数ジェネレーターの作成方法に関する優れた記事があります。

于 2012-08-13T02:20:24.327 に答える