Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 6: piper => Thread-Erzeugung schlägt fehl
Hallo,
ich habe die Thread-Erzeugung eigentlich genau wie auf den Folien beschrieben gemacht, aber aus irgend einem Grund erhalte ich einen Speicherzugriffsfehler, beim Aufruf von pthread_create(…). Der Fehler tritt nur dann auf, wenn ich auf den erzeugten Thread auch warte, mit pthread_join(…). Errno wird bei der Erzeugung des Threads nicht gesetzt. Wenn ich nicht auf den Thread warte, wird aber die als Parameter angegebene Routine nicht durchlaufen.
Ich hoffe, dass anhand dieser Fehlerbeschreibung eine Fernanalyse möglich ist da ich ja schlecht meinen ganzen Code posten kann. Ein kleiner Ausschnitt:
pthread_t tids[argc];
for(int i=1;i<argc;i++) {
pthread_create(tids+i,NULL,SchreibThread,(void *) ((long)(i)));
}
for(int i=1;i<argc;i++) {
pthread_join(tids[i],NULL);
}
Vielen Dank für eure Unterstützung :).
Hast du an pthread_create wirklich keine Fehlerüberprüfung, oder ist das nur ein unvollständiger Ausschnitt?
Ich hab die errno auf ihren Wert überprüft und der ist 0.
So sieht die Zeile aus:
errno = pthread_create(tids+i,NULL,SchreibThread,(void *) ((long)(i)));
valgrind? Mit [m]-pthread[/m] kompiliert?
Ja, mit -pthread hab ich kompiliert.
Valgrind hat mir die Frage aber beantwortet. Es gab einen Speicherzugriffsfehler in meiner “SchreibThread”-Funktion.
Danke für den Tipp mit valgrind :).
Ja, ja, dieses valgrind ist der Geheimtipp
- valgrind sollte man eigentlich immer verwenden.
Ja, ich weiß ;-). Hab valgrind immer zum Schluss für die Entdeckung der Speicherlecks verwendet und nicht mehr dran gedacht, dass valgrind noch mehr kann :).