2012-10-21 92 views
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 
    } 

} 

林低水平程序員,我不知道如何使用先進的.NET線程技術,使用同步(?)等等。我知道如何創建一個額外的線程,並通過使用委託更新窗體上的一些控件。

我不知道如何使用2-8個線程完成相同的事情並相互競爭。

問題1是 - 你能幫我嗎?我不知道如何開始。解決方案NikoDrašković

編輯: 問題2是 - 將lock()方法鎖定我的數組讀取和寫入?

+0

你見過[lock](http://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.80%29.aspx)? – neeKo

+0

不,我沒有。這似乎是我的答案,但我需要一些更多的提示。我添加額外的問題。 – Kamil

回答

5

您可以使用lock語句來防止不同的線程同時運行相同的代碼。您需要一個引用來用作鎖的標識符。這是共同創建一個僅用於鎖定一個簡單的對象:

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

然後圍繞訪問您使用lock數組代碼:

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

您可能希望讓每個線程先計算在它負責的數據中可以看到的最佳值,然後結合這些最佳值。如果你經常運行被鎖定的代碼,你會讓這些線程相互等待,失去了很多原因,首先運行單獨的線程。

+0

嗯,在你的代碼bestResult不在裏面的同步對象。這是正確的嗎? – Kamil

+1

@Kamil:是的。對象引用僅用作標識符,以便所有線程都使用相同的監視器進行鎖定。 'lock'只保持線程同時進入相同的代碼塊,它不能保護你在'lock'語句中使用的變量中的數據。 – Guffa

+0

我應該把那把鎖放在哪裏?在我的計算線程?或者在主要的地方?現在,當你寫了關於鎖定代碼塊由多個線程運行我不知道...當我把它在線程方法它將不是相同的代碼塊? – Kamil