2012-12-20 27 views
0

你好,我是多線程,並試圖將其納入我的程序,以獲得一個特定的計算收斂速度更快。但是,當我創建如下兩個線程使用多線程兩個線程返回不同的輸入值?

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

    } 
+0

你可以顯示'f(x,y)'的代碼嗎?或者至少告訴我們'結果'是什麼類型,以及它是否在'f()'內被修改? – hatchet

+0
+0

中增加了f(x,y)另外,您正在運行的確切代碼是?如果您的實際代碼是每次迭代設置並啓動線程的for循環,則問題可能與您聲明和使用p0&p1的方式有關。 – hatchet

回答

0

基於你只能評論服用第二。 。

看看這

PCAcont.Future2Yrs(X)。去年()FirstOrDefault()StatNetWorthToAssets.GetValueOrDefault();

PCAcont未鎖定,您將得到第二個X的結果。
您需要鎖定。
並鎖定過去的回報,因爲可能linq被推遲。