pthreads
-
Kann das hier Probleme machen:
for(int i=0; i<N; i++) { pthread_create(&threads[i], NULL, hello, &i); }
Ich meine das &i. Schließlich ist i eigentlich nur die Zählvariable und ich hab ein ungutes Gefühl dabei.
-
Jo, denn Du übergibst die Adresse einer Variablen, die nach der Schleife nicht mehr existiert.
-
So wie der Code da steht mach er keine Probleme.
Was befürchtest du denn, was passieren könnte?
Dann kann man dir vllt sagen, ob die Befürchtung berechtigt istDir sollte allerdings klar sein, dass alle Threads den gleichen Zeiger bekommen.
Je nachdem wie lange die Threads brauchen bis sie den Zähler abfragen, kann es also sein, dass alle Threads den gleichen Wert bekommen oder ganz verschiedene, abhängig davon, wie weit der Hauptthread in der Schleife zu dem Zeitpunkt ist.EDIT: LordJaxom hat hier nur teilweise Recht.
Ja, aus Sicht der Programmiersprache existiert die Variable nach der Schleife nicht mehr.
In der Praxis wird aber auch nach der Schleife noch an der Adresse der letzte Wert von i liegen.
Zum Problem kann es aber trotzdem werden, da es dem Compiler natürlich freisteht die Adresse später anderen Variablen zukommen zu lassen (z.B. wenn in der Funktion noch eine weiter Schleife kommt...).
Du musst also mit unerwartetem Verhalten rechnen, aber dann erwartest du es ja und es ist nicht mehr unerwartet xDWomit du allerdings nicht rechnen musst ist hier ein Zugriffsfehler, da sich die Adresse stets im zugänglichen Stack befindet.
Nur um den Inhalt solltest du dich sorgen.
-
DrakoXP schrieb:
...
Dir sollte allerdings klar sein, dass alle Threads den gleichen Zeiger bekommen.
Je nachdem wie lange die Threads brauchen bis sie den Zähler abfragen, kann es also sein, dass alle Threads den gleichen Wert bekommen oder ganz verschiedene, abhängig davon, wie weit der Hauptthread in der Schleife zu dem Zeitpunkt ist.THIS
Genau das habe ich befürchtet. Gibts ne einfache Lösung? (ALso ohne dass ich zusätzliche Variablen brauche)
-
du könntest anstatt der Adresse den Zähler selbst übergeben.
// Thread erzeugung pthread_create(&threads[i], NULL, my_thread, (void*)i); // im Thread void * my_thread(void * param) { int threadID = (int)param; /// ... }
Ein Zeiger ist schließlich auch nur eine Zahl.