2017-08-27 2 views
0

Ich bin neu in Multithreading, und ich habe einen einfachen Code durch, was ich beim Surfen gelernt habe.mit C# Multithread zu berechnen

   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]; 
        } 
       } 
       */ 

Ich möchte überprüfen, ob dies der richtige Weg ist, um den Code unten zu "multithread". Wenn dieser Code nicht so effizient ist, würden Sie mir bitte helfen, einen besseren Weg zu finden?

+0

Wo haben Sie 'i' definiert? Ich sehe es nicht. –

+0

@GeorgeAlexandria Ich bin außerhalb des Codes, der Code ist in einem anderen für die Schleife. – user5876164

+0

Mögliches Duplikat von [Wenn eine Parallel.ForEach-Schleife anstelle einer regulären foreach verwendet werden soll?] (Https://stackoverflow.com/questions/12251874/when-in-a-parallel-foreach-loop-init-of-) -a-regulär-foreach) – mjwills

Antwort

1

zu machen, was Ihr versucht, Arbeit, Sie

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

bearbeiten

ein paar kleine Änderungen brauchen Wenn Sie Gonna nach unten geben Sie Ihre Meinung, zu erklären, warum. Das OP hat ein Codebeispiel gepostet, das er versucht, richtig zu funktionieren. Die Bearbeitung, die ich an seiner Lösung vorgenommen habe, zeigt, was er tun muss, damit der Code ohne böse Überraschungen funktioniert. Er wurde in einer Konsolen-App getestet und funktioniert.

+0

Das erscheint mir ein bisschen schwierig. Warum verwenden Sie jRef anstelle von j, und wenn ich die Anzahl der Threads insgesamt (Zeile mal Spalte) festlegen muss, wie soll ich das dann auf den Code anwenden? (=> Warum ist die Definition von Aufgaben außerhalb der for-Schleife) – user5876164

+0

@ user5876164 Warum nicht klein anfangen, Sie versuchen mehr zu beißen, als Sie wegkauen können. Geben Sie eine bestimmte Anzahl von Threads vor Hand an, anstatt sie dynamisch festzulegen. 'j' ist auf' jRef' eingestellt, weil Sie in Ihrem Beispiel 'j' innerhalb des Threads verwenden, den Sie gerade erstellt haben. Bei jeder Iteration ändert sich der Wert von "j" **, so dass dieser Teil Ihres Codes "C [i, j] + = A [i, k] * B [k, j];" niemals genau sein wird. Wenn 'j' = = 1 wäre, wenn Sie einen Thread gestartet hätten, würde' j' sich bei der zweiten Iteration auf den Wert 2 ändern und es würde alle Ihre Berechnungen durcheinander bringen –

+0

@ user5876164 Was ist Kja und all diese anderen Variablen, zeigen Sie was sie sind, weil du mich bittest, deinen Code zu erklären, ohne mir deinen Code zu zeigen –