【问题标题】:Using Multithreading two threads return same value with different inputs?使用多线程两个线程返回不同输入的相同值?
【发布时间】:2013-01-05 08:09:38
【问题描述】:

您好,我不喜欢多线程,并试图将其合并到我的程序中,以便让特定的计算更快地收敛。但是当我像下面这样创建两个线程时

        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;
        }

    }

【问题讨论】:

  • 你能显示f(x,y)的代码吗?或者至少告诉我们result是什么类型,是否在f()内部进行了修改?
  • 在 main 中添加了 f(x,y)
  • 另外,这是您正在运行的确切代码吗?如果您的实际代码是一个 for 循环,每次迭代都设置并启动一个线程,那么问题可能与您声明和使用 p0 和 p1 的方式有关。
  • 如果你在循环中有一个闭包(你的{ p1 = f(changePoint + 1, result); }),有一些不直观的事情可以继续。如果涉及循环,您应该显示您的实际代码。
  • 如果你调试 f 它会收到不同的 X 值吗?

标签: .net multithreading


【解决方案1】:

根据您的评论,您只选择了第二个。

看看这个

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

PCAcont 未锁定,您将获得第二个 X 的结果。
您需要锁定。
并锁定过去的回报,因为可能会延迟 linq。

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多