problem mit pthread
-
Hallo,
hab folgendes Problem:
ich möchte den Rückgabewert eines Threads "thfunktion ausgeben.
leider bekomm ich immer ein Segmentation fault. kann mir einer sagen wie ich den Rückgabewert des threads ausgeben kann?
danke für alle hinweiseandi
das hab ich über die syntax von pthread gefunden leider hilft mir das auch nicht weiter...
int pthread_join( pthread_t thread, void **thread_return );
//Diese Funktion wartet auf den Thread mit der ID, welche Sie als erstes Argument angeben. Der Rückgabewert des Threads wird in der Adresse von thread_return abgeleg
hier mein code:
#include <iostream> #include <stdio.h> #include <pthread.h> using namespace std; int number; void *thfunktion (void *) { number=6; cout <<"hallo"<<endl; return &number; } int main () { void** versuch; pthread_t th1; pthread_create (&th1, NULL,thfunktion,NULL); pthread_join (th1,versuch); cout<<*versuch<<endl; return 0; }
-
Du solltest pthread_join einen Zeiger auf eine deiner Variablen übergeben, damit dieser gesetzt werden kann. Folgender Code ist also besser:
#include <iostream> #include <cstdio> extern "C" { #include <pthread.h> } using namespace std; int number; extern "C" void * thfunktion (void *) { number=6; cout <<"hallo"<<endl; return &number; } int main () { pthread_t th1; pthread_create (&th1, NULL,thfunktion,NULL); void * ptr; pthread_join (th1, &ptr); int * versuch = static_cast<int*>(ptr); cout<<*versuch<<endl; return 0; }
-
danke
aber eine frage hab ich noch. Zu was das extern "C" brauch ich des ich hab den Thread eigentlich in einer C++ classe und will da net unbedingt noch des extern "c" mit reinhauen...danke mal
-
andi9 schrieb:
danke
aber eine frage hab ich noch. Zu was das extern "C" brauch ich des ich hab den Thread eigentlich in einer C++ classe und will da net unbedingt noch des extern "c" mit reinhauen...danke mal
Pthreads sind eine C Bibliothek und sind im Standard nur für Funktionen mit C Linkage definiert. Das heisst, du darfst pthread_create in C++ nur eine freistehende Funktion mit extern "C" übergeben. Diese kann dann natürlich eine Methode in der Klasse aufrufen.