2017-04-07 1 views
0
pthread_mutex_t mutexREAD; 
int main(int argc, char *argv[]){ 
    pthread_t READERthreads; 
    pthread_mutex_init(&mutexREAD, NULL); 
    string *fname; 
    cin>> *fname; 
    pthread_create(&READERthreads, NULL, reader_thread, (void*) fname); 
} 
void *reader_thread(void *param){ 
    string fname = *(string *) param; 
    cout<<"filename is "<< fname<<endl; 
    ifstream myfile(fname.c_str()); 
    return NULL; 
} 

Der Code oben segmentieren Fehler. Ich habe wahrscheinlich meine Zeiger durcheinander gebracht, aber ich weiß nicht, wo was schief gelaufen ist und wie kann ich es beheben?C++ void Zeiger

+1

Hier: 'cin >> * fname' – Arash

Antwort

1

Sie haben einen Zeiger auf string deklariert, verwenden Sie einfach eine string und übergeben Sie ihre Adresse.

pthread_mutex_t mutexREAD; 
int main(int argc, char *argv[]){ 
    pthread_t READERthreads; 
    pthread_mutex_init(&mutexREAD, NULL); 
    string fname; 
    cin>> fname; 
    pthread_create(&READERthreads, NULL, reader_thread, (void*) &fname); 
    pthread_join(&READERthreads,NULL); 
} 
void *reader_thread(void *param){ 
    string fname = *(string *) param; 
    cout<<"filename is "<< fname<<endl; 
    ifstream myfile(fname.c_str()); 
    return NULL; 
} 

Das andere Problem ist, dass Sie für Threadbeendigung warten Sie nicht, dann wird der Stapel reserviert Zeichenfolge freigegeben werden kann, bevor der Faden der Zeit, es zu benutzen hatte ... pthread_join in dem Laich Thread zu verwenden.

3

Zwei Probleme: Die erste und wahrscheinlich Ursache des Absturzes ist, dass Sie einen Zeiger fname haben, aber es tatsächlich nicht Punkt überall ist. Das führt zu undefined Verhalten, wenn Sie es dereferenzieren.

Sofern Sie keine anderen Strings an verschiedene Threads übergeben müssen, muss es kein Zeiger sein. Verwenden Sie einfach den Address-Of-Operator &, wenn Sie pthread_create aufrufen.

Sie können natürlich nutzen std::thread statt und die Zeichenfolge nach Wert übergeben und nicht über Zeiger kümmern überhaupt:

... 
std::string fname; 
std::cin >> fname; 

std::thread READERthread{&reader_thread, fname); 
READERthread.join(); 
... 

Und

void reader_thread(std::string fname) 
{ 
    ... 
} 

Das zweite Problem ist dass Sie nicht warten, bis der Thread beendet ist, bevor Sie den Prozess beenden. Das wird den Faden töten. Sie müssen entweder verbinden der Thread, der darauf wartet, dass es beendet wird. Oder Sie können es lösen und nur den Haupt-Thread (nicht den Prozess) beenden, wodurch der andere Thread im Hintergrund ausgeführt wird.