2016-08-01 1 views
0

Ich habe Probleme, mein C-Programm zu debuggen, wo das Ziel ist, 5 Threads zu erstellen und jeder von ihnen auf Größe-2-Chunks eines Arrays der Länge 10 arbeiten Das Ziel ist es, die Summe dieses Arrays zu erhalten. Mein aktuelles Programm ist etwas weniger trivial als das, da es dynamische Array-Größen und Thread-Zählungen benötigt, aber ich habe versucht, es zu diesem einfachen Problem zu vereinfachen, und es funktioniert immer noch nicht.C, Pthreads initialisiert in Schleife führt keine zugewiesene Funktion trotz Mutex ordnungsgemäß

dh.,

array = {1 2 3 4 5 6 7 8 9 10}

dann Thread1 auf Array funktioniert [0] und array [1]

und Thread2 arbeitet auf array [2] und array [3]

etc ...

thread5 auf Array arbeitet [8] und array [9]

Wenn ich jedoch meinen Code ausführe, erhalte ich seltsame Ergebnisse, selbst wenn ich eine Mutex-Sperre verwende.

Zum Beispiel ist dies eines meiner Ergebnisse beim Ausführen dieses Programms.

Thread #1 adding 3 to 0 New sum: 3 
Thread #1 adding 4 to 3 New sum: 7 
Thread #2 adding 5 to 7 New sum: 12 
Thread #2 adding 6 to 12  New sum: 18 
Thread #3 adding 7 to 18  New sum: 25 
Thread #3 adding 8 to 25  New sum: 33 
Thread #4 adding 9 to 33  New sum: 42 
Thread #4 adding 9 to 42  New sum: 51 
Thread #4 adding 10 to 51  New sum: 61 
Thread #4 adding 10 to 61  New sum: 71 
Sum: 71 

Zunächst einmal, warum gibt es keine Tabs vor der "neuen Summe" für die ersten 3 Zeilen? (Siehe mein printf Protokoll in calculate_sum Funktion). Und noch wichtiger: Warum führt thread0 seinen Job nie aus und warum wird Thread 4 zweimal ausgeführt?

+0

"Warum gibt es keine Tabs vor der" Neuen Summe "für die ersten 3 Zeilen?" - es gibt. – immibis

Antwort

4

Sie übergeben jedem Thread einen Zeiger auf ein Objekt, das möglicherweise zerstört wird, bevor der Thread gestartet wird.

args ist lokal, daher wird es zerstört, wenn das Programm den Gültigkeitsbereich verlässt, in dem es deklariert ist - also am Ende des for Schleifenkörpers.

Der Thread kann einige Minuten dauern, um zu starten. Wenn der Thread danach startet, greift er auf ein zerstörtes Objekt zu - in der Praxis wurde der Speicher wiederverwendet, um die Werte des nächsten Threads zu speichern.

Sie können es beheben, indem Sie die Thread-Daten dynamisch mit malloc (und Erinnern an free es im Thread oder wenn pthread_create fehlschlägt) zuweisen.

+0

Oh richtig! Das war meine ursprüngliche Implementierung, aber ich mochte den Gedanken an malloc nicht und habe jedes Mal freigelassen, also ging ich mit diesem! Ok das macht Sinn, ich werde es versuchen! – vgbcell

+0

@vgbcell Sie können auch ein lokales Array verwenden und jedem Thread einen Zeiger auf ein anderes Array-Element übergeben (und sicherstellen, dass das Array erst zerstört wird, wenn alle Threads mit ihren Teilen des Arrays fertig sind). – immibis

Verwandte Themen