2017-08-27 105 views
0

我是新來的多線程,我通過我在衝浪時學到的東西做了一個簡單的代碼。使用c#多線程來計算

   Task[] tasks = new Task[B.Col]; 
       for(int j = 0; j < B.Col; j++) 
       { 
        tasks[j] = Task.Run(() => 
        { 
         for (int k = 0; k < A.Col; k++) 
         { 
          C[i, j] += A[i, k] * B[k, j]; 
         } 
        }); 
       } 
       /* 
       for(int j = 0; j < B.Col; j++) 
       { 
        for(int k = 0; k < A.Col; k++) 
        { 
         C[i, j] += A[i, k] * B[k, j]; 
        } 
       } 
       */ 

我想檢查這是否是'多線程'下面的代碼的正確方法。如果這段代碼效率不高,請你幫我找一個更好的方法嗎?

+0

你在哪裏定義'i'?我沒看到它。 –

+0

@GeorgeAlexandria我在代碼之外,代碼在另一個循環中。 – user5876164

+0

[何時使用Parallel.ForEach循環而不是常規的foreach?]可能的副本(https://stackoverflow.com/questions/12251874/when-to-use-a-parallel-foreach-loop-instead-of -a-regular-foreach) – mjwills

回答

1

爲了讓你的工作嘗試,你需要一些小的修改

Object thisLock = new Object(); 

int totalThreads = 3; 
Task[] tasks = new Task[totalThreads]; 
for (int j = 0; j < totalThreads; j++) 
{ 
    // We're taking a reference of the value of `j`, 
    // this is because on each iteration, the value of `j` 
    // will change and cause issues in your threads. 
    var jRef = j; 

    tasks[jRef] = Task.Run(() => 
    { 
     for (int k = 0; k < totalThreads; k++) 
     { 
      lock (thisLock) 
      { 
       // Perform operations on shared resources 
      } 
     } 
    }); 
} 

Task.WaitAll(tasks); 

編輯

如果你要投下來的,解釋原因。 OP發佈了一個他試圖正確運行的代碼示例。我對他的解決方案進行的編輯演示了他需要做什麼來使代碼正常工作而不會產生令人討厭的驚喜,它在控制檯應用程序中進行了測試,並且其作品作品

+0

這對我來說似乎有點棘手。爲什麼你使用jRef而不是j,並且如果必須使行數(行數col)超過總線程數,我應該如何將其實際應用於代碼? (=>爲什麼在for循環之外定義任務) – user5876164

+0

@ user5876164爲什麼不從小開始,你試圖咬的比你可以咀嚼的多。手動指定一定數量的線程,而不是動態設置它。 'j'被設置爲'jRef',因爲在你的例子中,你在剛剛創建的線程中使用'j'。在每一次迭代中,'j' **的值都會改變**,所以這部分代碼'C [i,j] + = A [i,k] * B [k,j];'永遠不會是準確的。如果當你開始一個線程時'j' == 1,'j'會在第二次迭代時改變爲2的值,並且它會搞亂你所有的計算 –

+0

@ user5876164什麼是kja和所有這些其他變量,顯示什麼他們是因爲你要求我解釋你的代碼而沒有向我顯示你的代碼 –