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:

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?

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:

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.

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?