0

こんにちは、私はマルチスレッドに慣れておらず、特定の計算をより速く収束させるために、それをプログラムに組み込んでいます。しかし、以下のように2つのスレッドを作成すると

        Thread firstThread = new Thread(() => { p0 = f(changePoint, result); });
        Thread secondThread = new Thread(() => { p1 = f(changePoint + 1, result); });
        firstThread.Start();
        secondThread.Start();
        firstThread.Join();
        secondThread.Join();

p0 と p1 の値は同じです (p0 は p1 と同じ値を持ちます)。今、マルチスレッドを取り除き、次のように呼び出すと:

        p0 = f(changePoint, result);
        p1 = f(changePoint + 1, result);

異なる値が返され、すべてが正しく機能します。

私は何が欠けていますか?

f(x,y)のコード

public double f(double x,double result)
    {

        double temp = PCAcont.Future2Yrs(x).Last().FirstOrDefault().StatNetWorthToAssets.GetValueOrDefault();
        return temp - result;

    }

主な方法

public double SecantMethod(double prec, int stepsCutoff, double changePoint, double result)
    {
        double p2, p1 = 0, p0 = 0;
        int i;

        Thread firstThread = new Thread(() => { p0 = f(changePoint, result); });
        Thread secondThread = new Thread(() => { p1 = f(changePoint + 1, result); });
        firstThread.Start();
        secondThread.Start();
        firstThread.Join();
        secondThread.Join();

        //p0 = f(changePoint, result);
        //p1 = f(changePoint + 1, result);
        p2 = p1 - f(p1, result) * (p1 - p0) / (f(p1, result) - f(p0, result));

        for (i = 0; System.Math.Abs(p2 - p1) > prec && i < stepsCutoff; i++)
        {
            p0 = p1;
            p1 = p2;
            p2 = p1 - f(p1, result) * (p1 - p0) / (f(p1, result) - f(p0,result));
        }
        if (i < stepsCutoff)
            return p2;
        else
        {
            System.Diagnostics.Debug.WriteLine("{0}.The method did not converge", p2);
            return double.NaN;
        }

    }
4

1 に答える 1

0

あなたのコメントに基づいて、2番目だけを取ります。

これを見て

PCAcont.Future2Yrs(x).Last().FirstOrDefault().StatNetWorthToAssets.GetValueOrDefault();

PCAcont はロックされておらず、2 番目の X の結果を取得してい
ます。ロックする必要があります。
そして、linq が延期される可能性があるため、リターンを過ぎてロックします。

于 2012-12-21T17:32:24.717 に答える