PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: pthreads und mutexlocks


Eggcake
2011-10-30, 11:57:49
Hallo,

ich muss gerade eine Übung in C++ schreiben. Und zwar soll ein inplace quicksort mit pthreads geschrieben werden (d.h. die rekursiven Aufrufe sollen an neue threads übergeben werden). Es soll eine maximale Anzahl an Threads erstellt werden.

Nun - prinzipiell funktioniert das Sortieren, nur habe ich das Problem, dass bei der Threaderstellung eigentlich etwas schief läuft. Ich weiss auch wieso (habe eine starke Vermutung), aber weiss nicht wie ich es lösen soll ohne den ganzen Code neu zu schreiben.

Anstatt dass ich quicksort(A, low, pivot -1) und quicksort(A,pivot + 1, high) aufrufe, mache ich folgendes (d:

if (noThreads < MAX_THREADS) {
pthread_create(&threads[noThreads++], NULL, quicksort, (void*) &arg1);
cout << "Thread " << noThreads << endl;
} else {
quicksort((void*) &arg1);
}
if (noThreads < MAX_THREADS) {

pthread_create(&threads[noThreads++], NULL, quicksort, (void*) &arg2);
cout << "Thread " << noThreads << endl;
} else {
quicksort((void*) &arg2);
}

Wobei noThreads eine statische variable ist. Das Ding ist, dass nun noThreads nicht "gelockt" ist. Das heisst währenddem z.B. der 4. und letzte Thread erstellt wurde, kann der eine nach wie vor einen Thread erstellen, wenn die Variable zuvor gelesen wurde. Zumindest nehme ich an, dass dies der Fehler ist, denn ich bekomme Outputs wie "Thread 1 Thread 2 Thread 2 Thread 4" und solche Dinge. Aber wie oder was locke ich denn nun am besten? Selbst wenn ich das Ganze hier mit einem mutex lock sperre (was wohl relativ blöd wäre) geht es nicht und ich weiss nicht wieso...

Hoffe das Codefragmentchen reicht um zu verstehen was ich meine. :) Ich muss einfach sicherstellen, dass alle Threads von der korrekten Anzahl an bereits existierenden Threads ausgehen. Nur das klappt selbst dann nicht, wenn ich das komplette obere Fragment in ein mutex_lock / unlock packe...das verstehe ich nicht ganz...

robobimbo
2011-10-30, 18:03:14
du brauchst nur einen einfachen mutex um die beiden pthread_create aufrufe, der punkt bei dem es "knallt" ist das noThreads++ wie du schon richtig erkannt hast

wichtig ist, nur eine mutex variable für beide aufrufe zu verwenden. wenn es dann noch immer nicht klappt, dann musst du mehr code posten, vielleicht sieht man es dann besser.

welches argument bekommen die mutex-threads mitübergeben? &arg1 ist der zeiger auf das array? wenn ja - wo sind die anderen beiden parameter?

Eggcake
2011-10-30, 23:37:56
So, es hat nun doch noch geklappt, denke ich. Ich habe einfach vor den beiden if Statements jeweils ein mutex lock eingebaut der einfach prüft ob noThreads schon "drüber" ist oder nicht und auch wirklich nur einer gleichzeitig diesen updaten kann. Wenn ich's über den ganzen oberen Block mache, gibt's scheinbar einen Deadlock (das Programm endete nicht mehr - gross Gedanken drüber habe ich mir keine mehr gemacht - zu müde :D ).

&arg ist ein pointer auf ein struct, welches einen Pointer zum Array und einen int für "low" und "high" beinhaltet.


Hach bin ich froh dass es nun doch noch geklappt hat, diese Übung war eine einzige Zangengeburt. Über Probleme mit Quicksort (den ich eigentlich in und auswendig dahinklatschen kann), zu Problemen mit NetBeans und schliesslich noch Probleme beim Kompilieren...aber nun flüppts!


Danke für die Hilfe!