Seite 1 von 1
void* zu std::string
Verfasst: Fr Jul 27, 2012 11:29 pm
von Kmitska
Hallo Leute,
habe folgendes Problemchen:
Ich arbeite mit pthreads zusammen, wo ich als Parameter einen void-Zeiger geben muss:
Ich habe am Anfang beim Aufrufen einen std::string, den ich dann zu einem void* caste:
Code: Alles auswählen
string s = "test";
pthread_t t;
pthread_create(&t, NULL, clientProcess, (void*) &s );
Nun kommt mein Problem:
ich schaffe es irgendwie nicht, einen normalen std::string zu erhalten.
Habe folgendes Probiert, doch bekomme leider eine Meldung im Console, die "Segmentation fault (core dumped" lautet.
Code: Alles auswählen
void* clientProcess(void* p)
{
string* tmp = (string*) p;
string request = *tmp;
cout << request;
return NULL;
}
Wie mache ich nun aus einem void-Zeiger ein std::string?
Re: void* zu std::string
Verfasst: Fr Jul 27, 2012 11:52 pm
von nufan
Verwendest du den String im Hauptthread? Wird er eventuell zerstört, bevor er noch im anderen Thread ausgegeben wird bzw umgekehrt? Ändere mal deine Ausgabe auf:
und schau, ob jetzt etwas ausgegeben wird.
Ein kompilierbares Beispiel (mit Anweisungen zum Kompilieren) wäre von Vorteil.
Re: void* zu std::string
Verfasst: Sa Jul 28, 2012 12:05 am
von Kmitska
Ich merke gerade, dass dies funktioniert:
Code: Alles auswählen
int main ( int argc, char* argv[] )
{
string str = "hello";
pthread_t t;
pthread_create(&t, NULL, clientProcess, (void*) &str );
return 0;
}
void* clientProcess(void* p)
{
string* tmp = (string*) p;
string request = *tmp;
cout << request;
return NULL;
}
Doch wenn ich im main eine while(true)-Schleife setze kommt nichts.
Code: Alles auswählen
int main ( int argc, char* argv[] )
{
while(true)
{
string str = "hello";
pthread_t t;
pthread_create(&t, NULL, clientProcess, (void*) &str );
sleep(1);
}
return 0;
}
In meinem Code befindet sich dieser Vorgang ebenfalls in einer while Schleife, liegt es vielleicht daran?
Wenn ja wieso? Die Befehle müssten doch nach der Reihe ausgeführt werden.
Re: void* zu std::string
Verfasst: Sa Jul 28, 2012 12:14 am
von Kmitska
Irgendwie funktioniert das jetzt, habe es gelöst.
Re: void* zu std::string
Verfasst: Sa Jul 28, 2012 12:16 am
von nufan
Kmitska hat geschrieben:Ich merke gerade, dass dies funktioniert:
Code: Alles auswählen
int main ( int argc, char* argv[] )
{
string str = "hello";
pthread_t t;
pthread_create(&t, NULL, clientProcess, (void*) &str );
return 0;
}
void* clientProcess(void* p)
{
string* tmp = (string*) p;
string request = *tmp;
cout << request;
return NULL;
}
Funktioniert bei mir nicht. Zumindest nicht so wie du es willst. Du wartest nicht bis der Thread fertig ist. Da main zuerst fertig ist, wird der Thread einfach abgebrochen, egal wo er gerade ist. Um auf die Beendigung des Threads zu warten, solltest du pthread_exit verwenden.
Kmitska hat geschrieben:Doch wenn ich im main eine while(true)-Schleife setze kommt nichts.
Code: Alles auswählen
int main ( int argc, char* argv[] )
{
while(true)
{
string str = "hello";
pthread_t t;
pthread_create(&t, NULL, clientProcess, (void*) &str );
sleep(1);
}
return 0;
}
In meinem Code befindet sich dieser Vorgang ebenfalls in einer while Schleife, liegt es vielleicht daran?
Wenn ja wieso? Die Befehle müssten doch nach der Reihe ausgeführt werden.
Funktioniert bei mir wie es soll. Hast du die Ausgabe abgeändert, wie ich es dir vorhin gesagt habe?