void* zu std::string

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

void* zu std::string

Beitrag von Kmitska » Fr Jul 27, 2012 11:29 pm

Hallo Leute,

habe folgendes Problemchen:
Ich arbeite mit pthreads zusammen, wo ich als Parameter einen void-Zeiger geben muss:

Code: Alles auswählen

void* clientProcess(void* p)
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?

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: void* zu std::string

Beitrag von nufan » Fr Jul 27, 2012 11:52 pm

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:

Code: Alles auswählen

cout << request << endl;
und schau, ob jetzt etwas ausgegeben wird.
Ein kompilierbares Beispiel (mit Anweisungen zum Kompilieren) wäre von Vorteil.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: void* zu std::string

Beitrag von Kmitska » Sa Jul 28, 2012 12:05 am

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.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: void* zu std::string

Beitrag von Kmitska » Sa Jul 28, 2012 12:14 am

Irgendwie funktioniert das jetzt, habe es gelöst.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: void* zu std::string

Beitrag von nufan » Sa Jul 28, 2012 12:16 am

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?

Antworten