1

多くの浮動小数点数の計算を行うマルチスレッドをアプリケーションに実装しようとしています(ニューラルネットワーク)。

必要な計算を行い、その関数の外で配列を更新する関数を作成しました。私の実際のシングルスレッドコードは次のようになります(理解を深めるために簡略化されています)。

class MyClass
{
    // this array after all calculations should contain 
    // result of only one calculation, 
    // that returned smallest value in one of array fields 
    // (smallest neural network error)
    float[] bestResult;

    // runs calculations on all "sets of data"
    public void findBestResult(void)
    {
        foreach (something...) // data rows from database cached in one array
        {
            calculate(x[]);
        }
    }

    // calculates one "set of data"
    public void calculateAndUpdateResultIfBetter(float[] inputData)
    {

        if (bestResult[0] > calculatedData[0])
             bestResult = calculatedData; // update only if condition is true
    }

}

低レベルのプログラマーですが、Synchronizeなどを使用する高度な(?).NETスレッド手法の使用方法がわかりません。デリゲートを使用して、何かに追加のスレッドを1つ作成し、フォームのコントロールを更新する方法を知っています。

2〜8個のスレッドでまったく同じことを行い、互いに競合する方法がわかりません。

質問1は-これで私を助けてくれませんか?どうやって始めたらいいのかわからない。ニコ・ドラシュコビッチが解決

編集:質問2は-lock()メソッドは読み取りと書き込みのために配列をロックしますか?

4

1 に答える 1

5

このステートメントを使用しlockて、異なるスレッドが同じコードを同時に実行するのを防ぎます。ロックの識別子として使用する参照が必要です。ロックにのみ使用される単純なオブジェクトを作成するのが一般的です。

float[] bestResult;
object sync = new Object();

次に、使用する配列にアクセスするコードの周りlock

lock (sync) {
  if (bestResult[0] > calculatedData[0]) {
    bestResult = calculatedData;
  }
}

各スレッドが最初に、担当するデータ内で確認できる最良の値を計算し、次にそれらの最良の値を組み合わせることができます。ロックされたコードを頻繁に実行すると、スレッドが互いに待機するようになり、そもそも個別のスレッドを実行する理由の多くが失われます。

于 2012-10-21T23:21:39.343 に答える