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...
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...